SQLite删除特定行无效

时间:2017-09-07 16:24:19

标签: java android sqlite android-sqlite

我已在我的应用程序中使用以下命令创建了一个SQLite表。

 db.execSQL("Create table if not exists mytab(Id INTEGER PRIMARY KEY autoincrement not null,deviceid int,leftsof Real,rightsof Real)");

我现在在这个表中有大约30000行,我正在将数据传输到服务器。数据正在顺利插入到服务器表中,但在每次插入时我都要删除要插入的特定SQLite表行。

这是代码。

     try {


                        for (int i = 0; i < databaseWorking.getlati().size(); i++) {
                            System.out.println("Local DB Size " + databaseWorking.getlati().size());

//code for insertion
                            if (response == 200) {

                                databaseWorking.deleterow(i);
                            }
                        }

删除行的代码

  void deleterow(int id) {
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        String query = "Delete from mytab Where Id=" + id ;
                   sqLiteDatabase.execSQL(query);
    }

但是,虽然正在调用delete方法并且没有错误,但不会删除行。每次我得到相同大小的数据库。

有人可以指导吗?

1 个答案:

答案 0 :(得分:1)

当然,对于第一次迭代,没有删除,因为 i (for循环计数器)将为0,并且没有 Id 为0的行,除非你已将 Id 设置为0。后续行是否匹配我是不可能用给出的信息说的。

我建议检索实际的 ID ,例如

1)添加一个新方法以获取要传输和删除的所有行(这假设全部);

Cursor getRowsToDelete() {
    SQLiteDatabase db = this.getWriteableDatabase;
    Return db.query("mytab",null,null,null,null,null,null);
}

2)修改现有的deleterow方法以接受long,使用delete方法(这将返回为每个删除的行数)并返回已删除的行数。

int deleterow(long id) {
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    sqLiteDatabase.delete("mytab",
        "Id=?,
        new String[]{Long.toString(id)});
}

3)取代for循环使用: -

SQliteDatabase databaseWorking;
Cursor csr = databaseWorking.getRowsToDelete();
int initialrowwcount = csr.getCount();
int deletecount = 0;
while (csr.moveToNext()) {
     //....... your insertion code .....
    if (response == 200) {
        if (databaseWorking.deleterow(csr.getLong(csr.getColumnIndex("Id"))) < 1) {
            System.out.println(" Row with Id " +
                csr.getLong(csr.getColumnIndex("Id")) + 
                " was not deleted.");
        } else {
            deletecount++;
        }
    }
}
csr.close();
System.out.println("Out of " +
        Integer.toString(initialrowcount) +
        " rows, " +
        integer.toString(deleteccount) +
        " rows were deleted.";
}

使用在步骤1中创建的getRowsToDelete方法将所有行检索到SQLite Cursor中。然后使用Cursor的moveToNext方法遍历行,这将循环遍历Cursor的行,这可能是以任何顺序(您可以在query方法中指定顺序)。

使用Cursor的getLong方法提取实际ID(但是有一个getInt方法,因为rowid&#39;指定Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL使 Id 列ROWID列的别名))。

所有获取的getLong方法?????方法将列索引(偏移量,因此0是第一列)作为参数(Id很可能为0)。但是,getColumnIndex将列名称作为字符串,因为它的参数根据列名返回列索引(使用它不太可能导致编码不正确的列索引)。

csr.close()用光标关闭/结束。

以上代码是使用SQLite TRANSACTION的主要候选者。但是,为简洁起见,未包括在内。使用交易可以显着减少所花费的时间。