SQLite自动增量未插入

时间:2019-04-18 16:15:56

标签: android android-sqlite sqliteopenhelper

我有一个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

1 个答案:

答案 0 :(得分:0)

您似乎希望id列为空而不是数字。

如果您编码id INTEGER PRIMARY KEY NOT NULL AUTOINCREMENT请参见下面有关AUTOINCREMENT的注释),则该列是特殊列,是 rowid 列的别名(除非表已使用WITHOUT ROWID定义)。

列不能为空,并且必须为整数值。如果尝试在该列的值为空(或未指定)的行中插入行,则SQLite将分配一个整数值(java的long值)。如果表中没有行,则为1,则比使用的最大行数大1。

为什么在id列中会有数字序列。

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

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

因此最后一个定义将允许您看起来像预期的结果。。但是,不确定值用于 id 行的目的是什么? (这很夸张)。

因此,您最初获得的结果是更有用的结果。即使不希望如此。


关于AUTOINCREMENT

的注释

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

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

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

使用 AUTOINCREMENT 时,已分配了可能的最高值(9223372036854754775807),并尝试插入新行。然后将导致SQLITE_FULL错误。如果没有,则尝试使用随机的未使用值(例如,是否已删除行)。

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

注意

应该注意的是,无论是否有AUTOINCREMENT关键字,rowid都不会增加1。在某些情况下,根据

值可能会被跳过。
  

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

SQLite Autoincrement

*简而言之,对* id/rowid 列不希望是任何其他手段,这是不明智的有效识别行的方法。