我有一个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;
}
看起来您期望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值相互比较是唯一的。
因此,最后一个定义将允许看起来像您的预期结果。但是,为了识别行,不确定值的用途是什么? (这是修辞)。
因此,您最初获得的结果是更有用的结果。即使没有打算。
很可能不需要AUTOINCREMENT,这指定了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%)。
应该注意的是,无法保证带有或不带AUTOINCREMENT关键字的rowid将增加1.在某些情况下,可能会跳过值。
请注意,“单调增加”并不意味着ROWID总是增加一个。一个是通常的增量。但是,如果插入因(例如)唯一性约束而失败,则失败的插入尝试的ROWID可能不会在后续插入中重用,从而导致ROWID序列中出现间隙。 AUTOINCREMENT保证自动选择的ROWID将增加但不是它们将是连续的。
*简而言之,对* id/rowid
专栏的任何期望都不是有效识别行的方法。