gpt4 book ai didi

java - SQLite 删除特定行不起作用

转载 作者:行者123 更新时间:2023-11-30 00:22:05 26 4
gpt4 key购买 nike

我在我的应用程序中使用以下命令创建了一个 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 是使用游标的 getLong 方法提取的(有一个 getInt 方法,但是作为 rowid 的(指定 Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL 使得 Id 列是 ROWID 列的别名))。

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

csr.close() 使用光标关闭/完成。

上面的代码将是使用 SQLite 事务的主要候选者。然而,为简洁起见,这没有包括在内。使用事务可以显着减少所花费的时间。

关于java - SQLite 删除特定行不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46101140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com