我在我的应用程序中使用以下命令创建了一个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的主要候选对象。但是,为简便起见,未包括在内。使用事务可以显着减少花费的时间。