这是我创建数据库的方法。
CREATE TABLE $_tableName(
id INTEGER NOT NULL PRIMARY KEY,
category TEXT,
content TEXT,
date TEXT
)
当我删除任何数据时,id从它停止的地方继续。例如,我有范围为1-10的id数据。当从数据库中删除内容编号3时,新添加的值id变为11。我想将新值保存在空白的3字段中。
Future<int> add(NoteDbModel saveDbModel) async {
Database db = await instance.database;
return await db.insert(_tableName, saveDbModel.toMap());
}
Future<int> remove(int id) async {
Database db = await instance.database;
return await db.delete(_tableName, where: 'id = ?', whereArgs: [id]);
}
1条答案
按热度按时间ljo96ir51#
除了虚拟表和WITHOUT ROWID表之外,SQLite以特殊方式处理包含定义为
INTEGER
且PRIMARY KEY
的列的表。该列是可归类为SUPER KEY的列的别名,即隐藏的rowid列的别名。SQLite支持(优化)使用rowid或其别名。当扫描/搜索底层索引时,扫描/搜索的速度可以达到两倍。
正如您所发现的,如果在插入一个带有这样一个列的行时,为该列提供了一个值,则会生成该值,这就像
max((SELECT id FROM theTable))+1
一样简单。因此,如果删除了最后一行以外的任何行,则该值保持未使用状态(请参见以下注解,因为这实际上并不是全部事实)。
尝试将列用于任何其他目的,例如希望它是特定的值以适合人类,通常会导致问题,例如您所提出的问题。
:-
1.使用生成的ID初始填充行之后:-
1.删除奇数id后
1.添加7行生成的ID(即问题)后,即错误
1.删除错误插入后(返回2))
1.使用fix(原文如此)SQL插入两行后