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 值与is 匹配的行。 明白了,我这里只是把真话简写为代表,其实就是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 删除特定行不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android SQLite 更新行不起作用并且没有显示错误

Pandas 用 df.drop 删除行不起作用

引导表单组行不起作用

可可沙箱嵌入式命令行不起作用

DROP TABLE 在 sqlite 中不起作用

UIPickerView 选择行不起作用 ios7