Автоинкремент SQLite не вставляется - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть база данных SQLite, и при вставке идентификатор должен автоматически увеличиваться с помощью AUTOINCREMENT.

Но он всегда равен нулю.

Это таблица создания

    @Override
       public void onCreate(SQLiteDatabase db) {
       db.execSQL("CREATE TABLE ausgaben (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, TAG text,DATUM text, AUSGABE text, MENGE text, KATEGORIE text)");
    }

И вот как я вставляю данные:

    public boolean insertAusgabe(String tag, String datum, String ausgabe, String menge, String kategorie){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.putNull("id");
    contentValues.put(AUSGABEN_TAG,tag);
    contentValues.put(AUSGABEN_DATUM,datum);
    contentValues.put(AUSGABEN_AUSGABE,ausgabe);
    contentValues.put(AUSGABEN_MENGE,menge);
    contentValues.put(AUSGABEN_KATEGORIE,kategorie);
    db.insert(TABLE_NAME,null,contentValues);
    return true;
}

Если я правильно понимаю, это должно работать правильно.Но база данных выглядит так: enter image description here

1 Ответ

0 голосов
/ 19 апреля 2019

Может показаться, что вы ожидаете, что столбец id будет нулевым, а не числом.

Если вы наберете id INTEGER PRIMARY KEY NOT NULL AUTOINCREMENT ( см. Примечание об AUTOINCREMENT ниже ), тогда этот столбец является специальным столбцом, который является псевдонимом столбца rowid (если таблица не была определена используя БЕЗ ROWID).

Столбец rowid не может быть пустым и должен быть целочисленным значением. Если предпринята попытка вставить строку, в которой значение столбца равно нулю (или не указано), SQLite назначит целочисленное значение (длинное для java). 1, если в таблице нет строк, то на 1 больше, чем наибольшее использованное число.

Следовательно, почему у вас есть последовательность чисел в столбце id.

Если, например, таблица была определена с использованием id INT PRIMARY KEY NOT NULL, то столбец id НЕ является псевдонимом столбца rowid . (AUTOINCREMENT не может быть использован, так как он может использоваться только для псевдонима столбца rowid ) Тогда ни одна из вставок не будет работать, так как значение для столбца id будет NULL что из-за кодирования ограничения NOT NULL приведет к конфликту ограничений.

Однако, если столбец был определен с использованием id INT PRIMARY KEY, тогда допустимы нулевые значения для id . Отмечая, что кодирование PRIMARY KEY, подразумевает УНИКАЛЬНОЕ ограничение, то есть все значения должны быть УНИКАЛЬНЫМИ. SQLite считает все значения NULL уникальными по сравнению друг с другом.

Таким образом, последнее определение позволило бы получить то, что представляется вашим ожидаемым результатом. Однако какое значение будет иметь неопределенное значение для id , представляющего строку? (это риторический).

Как результат, который вы изначально получили, это более полезный результат. Даже если не предназначен.


Примечание по АВТОИНФРАКЦИЯ

AUTOINCREMENT , скорее всего, не требуется, это указывает на расширение алгоритма определения rowid в том смысле, что оно

  • заставляет самое последнее значение rowid превышать любое существующее или используемое rowid ,

то есть он опирается на другую таблицу, а именно sqlite_sequence для записи самого высокого выделенного значения rowid , а затем использует более высокий из самых высоких существующих rowid или значение, сохраненное для таблицы в таблице sqlite_sequence.

С AUTOINCREMENT , когда было назначено максимально возможное значение (9223372036854775807) и сделана попытка вставить новую строку. Тогда ошибка SQLITE_FULL приведет. Без этого предпринимаются попытки использовать случайное неиспользуемое значение (например, если строки были удалены).

С AUTOINCREMENT есть издержки (что-то вроде 8-12% в соответствии с Каковы издержки использования AUTOINCREMENT для SQLite на Android? ).

Примечание

Следует отметить, что нет гарантии, что rowid с ключевым словом AUTOINCREMENT или без него увеличится на 1. В некоторых ситуациях значения могут быть пропущены согласно

Обратите внимание, что «монотонно возрастающее» не означает, что ROWID всегда увеличивается ровно на единицу. Одним из них является обычный прирост. Однако, если вставка завершается неудачно из-за (например) ограничения уникальности, ROWID неудачной попытки вставки может не использоваться повторно при последующих вставках, что приводит к пробелам в последовательности ROWID. AUTOINCREMENT гарантирует, что автоматически выбранные ROWID будут увеличиваться, но не будут последовательными.

Автоинкремент SQLite

* Короче говоря, не стоит ожидать, что столбец * id/rowid будет чем-то иным, чем средством эффективной идентификации строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...