Java SQLite删除特定行不起作用
我已经在我的应用程序中使用下面的命令创建了一个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表行 下面是代码
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.";
}