Java SQLite删除特定行不起作用

Java SQLite删除特定行不起作用,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,我已经在我的应用程序中使用下面的命令创建了一个SQLite表 db.execSQL("Create table if not exists mytab(Id INTEGER PRIMARY KEY autoincrement not null,deviceid int,leftsof Real,rightsof Real)"); 我现在在这个表中有大约30000行,我正在将数据传输到服务器。数据顺利地插入到服务器表中,但每次插入时,我都要删除插入的特定SQLite表行 下面是代码

我已经在我的应用程序中使用下面的命令创建了一个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);
                            }
                        }
但是,尽管调用了delete方法,但并没有删除行,并且并没有错误。每次我都会得到相同大小的数据库


有人可以指导吗?

第一次迭代肯定不会删除,因为i(for循环计数器)将为0,并且不会有Id为0的行,除非您专门将Id设置为0。接下来的行是否匹配,我无法用给出的信息来判断

例如,我建议检索实际的Id

1) 添加一个新方法来获取要传输和删除的所有行(假设全部)

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.";
}
sqlitedatabaseworking;
游标csr=databaseWorking.getRowsToDelete();
int initialRowCount=csr.getCount();
int deletecount=0;
while(csr.moveToNext()){
//……您的插入代码。。。。。
如果(响应==200){
if(databaseWorking.deleterow(csr.getLong(csr.getColumnIndex(“Id”)))<1){
System.out.println(“具有Id的行”+
csr.getLong(csr.getColumnIndex(“Id”))+
“未被删除。”);
}否则{
deletecount++;
}
}
}
csr.close();
System.out.println(“out of”+
整数.toString(initialrowcount)+
“行,”+
整数.toString(deleteCount)+
“行已删除。”;
}
这将使用步骤1中创建的getRowsToDelete方法将所有行检索到SQLite游标中。然后使用游标的
moveToNext
方法对行进行循环,这将循环遍历游标中可能以任何顺序排列的行(您可以在
query
方法中指定顺序)

使用光标的
getLong
方法提取实际Id(但是有一个getInt方法作为rowid(指定
Id INTEGER主键AUTOINCREMENT NOT NULL
使Id列成为rowid列的别名))

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

csr.close()
用光标关闭/结束


上面的代码可能是使用SQLite事务的主要候选代码。但是,为了简洁起见,没有包括这一点。使用事务可以显著减少所花费的时间。

显然,没有带有
Id
值的行与那些
i
s匹配。明白了,我只是为了代表性的目的而在这里缩短了实词,实际上它们是leftsof和rightsof。我编辑了它们,并为此感到抱歉。@CL(Id INTEGER主键autoincrement不是可以比较的Id列?如果不是,那么我如何删除行,您如何知道哪些行已发送到服务器?或者是所有行?感谢mike分享不同的选项并帮助我使用ur 3找到解决方案option@Panache我很乐意帮忙。
int deleterow(long id) {
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    sqLiteDatabase.delete("mytab",
        "Id=?,
        new String[]{Long.toString(id)});
}
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.";
}