我已在我的应用程序中使用以下命令创建了一个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方法并且没有错误,但不会删除行。每次我得到相同大小的数据库。
有人可以指导吗?
答案 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的主要候选者。但是,为简洁起见,未包括在内。使用交易可以显着减少所花费的时间。