我在我的应用程序中使用以下命令创建了一个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方法,但不会删除行,并且没有错误。每当我获得相同大小的数据库时。

有人可以指导吗?

最佳答案

当然,对于第一次迭代,不会删除任何内容,因为i(for循环计数器)将为0,并且不会存在ID为0的行,除非您将Id专门设置为0。后续行是否与i匹配将无法通过给定的信息确定。

我建议例如检索实际的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方法中指定顺序)。

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

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

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

上面的代码将是使用SQLite TRANSACTION的主要候选对象。但是,为简便起见,未包括在内。使用事务可以显着减少花费的时间。

10-07 19:49
查看更多