Конечно, для первой итерации не будет удаления, так как 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) Измените существующий метод удаления строк, чтобы он принимал длинное значение, чтобы использовать метод 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.";
}
Это извлекает все строки в курсор SQLite, используя метод getRowsToDelete, созданный на шаге 1. Затем он перебирает строки, используя метод moveToNext
курсора, это будет перебирать строки курсора, которые могут быть в любом порядке (вы можете указать порядок в методе query
).
Фактический идентификатор извлекается с использованием метода getLong
курсора (однако существует метод getInt в качестве идентификатора строки (указание Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
делает столбец Id псевдонимом для столбца ROWID)).
Метод getLong
вроде у всех получается????? методы принимают индекс столбца (смещение, поэтому 0 — это первый столбец) в качестве аргумента (Id, скорее всего, будет равен 0). Однако getColumnIndex
, который принимает имя столбца в виде строки, в качестве аргумента возвращает индекс столбца в соответствии с именем столбца (использование этого с меньшей вероятностью приведет к кодированию неправильного индекса столбца).
csr.close()
закрывается/заканчивается курсором.
Приведенный выше код был бы первым кандидатом на использование ТРАНЗАКЦИИ SQLite. Однако для краткости это не было включено. Использование транзакции может заметно сократить затрачиваемое время.
person
MikeT
schedule
07.09.2017
Id
, соответствующих этимi
. - person CL.   schedule 07.09.2017