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);
                            }
                        }

Код для удаления строки

  void deleterow(int id) {
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        String query = "Delete from mytab Where Id=" + id ;
                   sqLiteDatabase.execSQL(query);
    }

Но строки не удаляются, хотя метод удаления вызывается и ошибки нет. Каждый раз, когда я получаю одинаковый размер базы данных.

может кто-нибудь направить?


person Panache    schedule 07.09.2017    source источник
comment
По-видимому, нет строк со значением Id, соответствующих этим i.   -  person CL.    schedule 07.09.2017
comment
поймите, я просто сокращаю настоящие слова здесь для репрезентативных целей, на самом деле они левые и правые.   -  person Panache    schedule 07.09.2017
comment
Я отредактировал и извините за это.   -  person Panache    schedule 07.09.2017
comment
@CL (автоинкремент Id INTEGER PRIMARY KEY не является столбцом Id, который можно сравнить? а если нет, то как я могу удалить строку,   -  person Panache    schedule 07.09.2017
comment
Как узнать, какие строки были отправлены на сервер? Или это все они?   -  person CL.    schedule 07.09.2017
comment
@CL, странно, что ты задавал вопросы вместо того, чтобы помогать, в любом случае возникла проблема, поскольку я передавал значение цикла как идентификатор для проверки и удаления, вместо этого я должен получить значение строки из таблицы, а затем передать его. Теперь он удаляет строки, наконец.   -  person Panache    schedule 09.09.2017


Ответы (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) Измените существующий метод удаления строк, чтобы он принимал длинное значение, чтобы использовать метод 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
comment
Спасибо, Майк, за то, что поделился различными вариантами и помог мне найти решение, используя вариант 3. - person Panache; 09.09.2017
comment
@Panache с удовольствием помогу. - person MikeT; 09.09.2017