SQLite 删除特定行不起作用
Posted
技术标签:
【中文标题】SQLite 删除特定行不起作用【英文标题】:SQLite delete specific row not working 【发布时间】:2017-09-07 16:24:18 【问题描述】:我在我的应用程序中使用以下命令创建了一个 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 方法并且没有错误,但行并没有被删除。每次我得到相同大小的数据库。
有人可以指导吗?
【问题讨论】:
显然,没有Id
值与i
s 匹配的行。
明白了,我这里只是把真话简写为代表,其实就是leftsof和rightsof。
我已编辑并为此感到抱歉。
@CL (Id INTEGER PRIMARY KEY autoincrement 不是可以比较的Id列?如果没有,我该如何删除行,
如何知道哪些行已发送到服务器?还是全部?
【参考方案1】:
当然,对于第一次迭代,不会删除,因为 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 游标中。然后使用游标的 moveToNext
方法循环遍历行,这将遍历游标的行,这些行可能位于任何顺序(可以在query
方法中指定顺序)。
实际的 Id 是使用 Cursor 的 getLong
方法提取的(有一个 getInt 方法,但是作为 rowid 的(指定 Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
使 Id 列成为 ROWID 列的别名)。
getLong
方法就像所有的 get????方法将列索引(偏移量,所以 0 是第一列)作为参数(Id 很可能是 0)。但是getColumnIndex
,它将列名作为字符串,因为它的参数根据列名返回列索引(使用它不太可能导致编码不正确的列索引)。
csr.close()
用光标关闭/结束。
上面的代码将是使用 SQLite TRANSACTION 的主要候选者。然而,为简洁起见,这并未包括在内。使用事务可以显着减少所花费的时间。
【讨论】:
感谢 mike 分享不同的选项并帮助我使用您的 3 选项找到解决方案 @Panache 很高兴为您提供帮助。以上是关于SQLite 删除特定行不起作用的主要内容,如果未能解决你的问题,请参考以下文章