SQLite自动增量不插入

问题描述 投票:0回答:1

我有一个SQLite数据库,当我插入ID时,应该自动增加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

android android-sqlite sqliteopenhelper
1个回答
0
投票

看起来您期望id列为null而不是数字。

如果您编写id INTEGER PRIMARY KEY NOT NULL AUTOINCREMENT代码(请参阅下面有关AUTOINCREMENT的注释),那么该列是一个特殊列,它是rowid列的别名(除非使用WITHOUT ROWID定义了表)。

rowid列不能为null,并且必须是整数值。如果尝试插入列的值为null(或未指定)的行,则SQLite将分配一个整数值(对于java而言为long)。 1如果表中没有行,那么1大于使用的最大数。

因此,为什么你在id列中有一系列数字。

例如,如果表是使用id INT PRIMARY KEY NOT NULL定义的,则id列不是rowid列的别名。 (然后不能使用AUTOINCREMENT,因为它只能用于rowid列的别名)然后没有任何插入工作,因为id列的值将为NULL,由于NOT NULL约束的编码将导致在约束冲突中

但是,如果使用id INT PRIMARY KEY定义列,则允许使用id的空值。注意编码PRIMARY KEY,意味着UNIQUE约束,即所有值必须是UNIQUE。 SQLite认为所有NULL值相互比较是唯一的。

因此,最后一个定义将允许看起来像您的预期结果。但是,为了识别行,不确定值的用途是什么? (这是修辞)。

因此,您最初获得的结果是更有用的结果。即使没有打算。


A note on AUTOINCREMENT

很可能不需要AUTOINCREMENT,这指定了rowid确定算法的扩展

  • 强制执行最新的rowid值大于任何现有或使用的rowid,

也就是说,它依赖于另一个表,即sqlite_sequence来记录最高分配的rowid,然后它使用现有最高rowid中较高者或sqlite_sequence表中为表存储的值。

使用AUTOINCREMENT时,已指定最高可能值(9223372036854775807)并尝试插入新行。然后会产生SQLITE_FULL错误。如果没有,则尝试使用随机未使用的值(例如,如果已删除行)。

使用AUTOINCREMENT有一个开销(根据What are the overheads of using AUTOINCREMENT for SQLite on Android?,大约8-12%)。

NOTE

应该注意的是,无法保证带有或不带AUTOINCREMENT关键字的rowid将增加1.在某些情况下,可能会跳过值。

请注意,“单调增加”并不意味着ROWID总是增加一个。一个是通常的增量。但是,如果插入因(例如)唯一性约束而失败,则失败的插入尝试的ROWID可能不会在后续插入中重用,从而导致ROWID序列中出现间隙。 AUTOINCREMENT保证自动选择的ROWID将增加但不是它们将是连续的。

SQLite Autoincrement

*简而言之,对* id/rowid专栏的任何期望都不是有效识别行的方法。

© www.soinside.com 2019 - 2024. All rights reserved.