android - Sqlite 不更新行

标签 android sql sqlite transactions android-sqlite

您好,我正在尝试更新一些行以增加 int 字段中的值,但它不起作用。 这是我的代码 fragment :

        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
        queryBuilder.setTables("TICKET");
        String[] proj = new String[]{ "TICKET","NUMERO_ARTICOLO","QUANTITA","COMMESSA_IN","CODICE_SQUADRA"};
        try{
            Cursor cursor = queryBuilder.query(sqlDB, proj, selection, null, null, null, null);
            sqlDB.beginTransaction();
            cursor.moveToFirst();
            while (cursor.moveToNext()){
                String query =     "UPDATE MATERIALE "
                        + " SET RIMANENTE = RIMANENTE - " + cursor.getString(cursor.getColumnIndex("QUANTITA"))
                        + " WHERE NUMERO_ARTICOLO = '"+cursor.getString(cursor.getColumnIndex("NUMERO_ARTICOLO"))+"'"
                        +" AND COMMESSA = '"+cursor.getString(cursor.getColumnIndex("COMMESSA_IN"))+"' "
                        +" AND CODICE_SQUADRA = '"+cursor.getString(cursor.getColumnIndex("CODICE_SQUADRA"))+"' ";
                Log.d("update","Query: "+query);
                sqlDB.rawQuery(query, null);
            }
            rowsUpdated = sqlDB.update("TICKET", values, selection, null);
            sqlDB.setTransactionSuccessful();
            Log.d("update","Aggiornate "+rowsUpdated+" righe");
            sqlDB.endTransaction();
        }catch (Exception e) {
            e.printStackTrace();
        }

        break;
    default:
        throw new IllegalArgumentException("Unknown URI: " + uri);
    }
    getContext().getContentResolver().notifyChange(CONTENT_URI, null);
    return rowsUpdated;

最后一个查询正在运行

rowsUpdated = sqlDB.update("TICKET",values,selection,null);

但是 while 循环不起作用。 我做错了什么?也许更新 SET RIMANENTE = RIMANENTE - "+cursor.getString(cursor.getColumnIndex("QUANTITA"))

我希望循环(while)和最后一次更新在同一个事务中。

最佳答案

当您从数据库中插入、更新或选择行时,Sqlite 使用基于文件的锁定。这意味着当您使用 Select 查询从数据库中获取记录时,直到包含该 select 语句的 cursor 未关闭,您才能插入 更新删除同时。
因此,您应该关闭cursor,然后使用execSQL代替rawQuery来触发update

    try
    {
        Cursor cursor = queryBuilder.query(sqlDB, proj, selection, null, null, null, null);
        //sqlDB.beginTransaction();
        List<String> updateSql = new ArrayList<String>();
        try
        {
            cursor.moveToFirst();
            while (cursor.moveToNext())
            {
                updateSql.add(    "UPDATE MATERIALE "
                        + " SET RIMANENTE = RIMANENTE - " + cursor.getString(cursor.getColumnIndex("QUANTITA"))
                        + " WHERE NUMERO_ARTICOLO = '"+cursor.getString(cursor.getColumnIndex("NUMERO_ARTICOLO"))+"'"
                        +" AND COMMESSA = '"+cursor.getString(cursor.getColumnIndex("COMMESSA_IN"))+"' "
                        +" AND CODICE_SQUADRA = '"+cursor.getString(cursor.getColumnIndex("CODICE_SQUADRA"))+"' ");
                Log.d("update","Query: "+query);                    
            }
        } 
        finally
        {
            cursor.close();
        }
      try
      {
        sqlDB.beginTransaction();
        for (String query : updateSql)
        {
            sqlDB.execSQL(query, null); //Here it should be execSQL instead of rawQuery
        }
        rowsUpdated = sqlDB.update("TICKET", values, selection, null);

        sqlDB.setTransactionSuccessful();
        Log.d("update","Aggiornate "+rowsUpdated+" righe");
      }
      finally
      {
        sqlDB.endTransaction();
      }
    }
    catch (Exception e) 
    {
        e.printStackTrace();
    }

编辑如果我读 documentation明确提到

For UPDATE statements, use any of the following instead.
update(String, ContentValues, String, String[])
updateWithOnConflict(String, ContentValues, String, String[], int)

关于android - Sqlite 不更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20349454/

相关文章:

android - picasso 图书馆今天停止使用 facebook 图图片链接

android - 如何创建小屏幕模拟器

java - 重载 onResume()

php - Mysql select 查询性能变差

c# - 如何将unity 3d场景导出到Android Studio

Mysql 跨表多个唯一键

php - 如何选择带条件的数据

php - SQL-查询帮助:查找局部最大值

SQLITE 分组依据

vb.net - SQLite Date索引未显示任何性能改进