这是我的数据库
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_CATEGORY + " TEXT NOT NULL, " +
KEY_DATE + " TEXT, " +
KEY_PRICE + " LONG, " +
KEY_DETAILS + " TEXT NOT NULL);"
);
这是删除所有数据的方法
public void deleteall() {
// TODO Auto-generated method stub
ourDatabase.delete(DATABASE_TABLE, null, null);
}
这是删除特定数据的方法
public void deletentry(long l) {
// TODO Auto-generated method stub
ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + " = " + l,null);
}
这里使用我删除的数据,但增加的row-id仍然存在,我想重置为1,因为数据被删除如果我删除一个特定的数据,row-id以序列方式改变它的值应该有row-id之间没有差距。
答案 0 :(得分:1)
我认为autoincrement
不是您的最佳选择。如果您的目标是创建一个没有间隙的简单编号表,则可以使用带有列的表来更轻松地处理此表,以便您手动跟上ID。
如果您创建了这样的表,则可以在代码中编写辅助方法以执行以下操作:addColumn,removeColumn,emptyTable。
您的addColumn
方法将查询该表并确定max(ID)
然后添加1并将该数字用于下一个条目。
您的removeColumn
方法可以按ID删除条目,然后使用该ID重新排序其上方的所有内容。或者,如果订单不重要,可以采取最后一行并重新识别它以填补空白。
您的emptyTable
方法可以删除所有条目。
<强>更新强> 也许这可以让你开始。这些方法需要在您的程序中定义。您必须将代码放入其中,然后将它们设置为被调用。
例如:
public void addColumn(String category, long date, String details) {
//code here would need to determine the max of ID and add one
//to it. the sql below would retrieve max, i dont know the sql lite code
//off the top of my head.
//SELECT MAX(ID) FROM DATABASE_TABLE;
int newID = max + 1;
//add row to the database using newID
}
public void removeColumn(int id) {
//remove column from database
//DELETE FROM DATABASE_TABLE WHERE ID = id;
//change last entry to use id
//UPDATE DATABASE_TABLE SET ID = id WHERE id = (SELECT MAX(ID) FROM DATABASE_TABLE);
}
public void emptyTable() {
//DELETE FROM DATABASE_TABLE;
}
要调用这些方法,您可以像在类中的任何其他java方法一样调用它们:
addColumn(12, 'text', (long)100, 'text');
removeColumn(10);
emptyTable();
答案 1 :(得分:1)
SQLite在特殊的SQLITE_SEQUENCE表中保留最大的ROWID。您可以将该表删除为:
db.delete("SQLITE_SEQUENCE","NAME = ?",new String[]{TABLE_NAME});
答案 2 :(得分:0)
不幸的是,SQLite AUTOINCREMENT
无法保证按您的意愿运行。引用docs:
如果在插入上没有指定ROWID,或者指定的ROWID没有 值为NULL,然后自动创建适当的ROWID。 通常的算法是给新创建的行一个ROWID 一个大于插入前表中最大的ROWID。如果 该表最初为空,然后使用ROWID为1。如果 最大的ROWID等于最大可能的整数 (9223372036854775807)然后数据库引擎开始挑选正面 候选人ROWID随机,直到找到之前没有的 用过的。如果在合理数量之后没有找到未使用的ROWID 尝试,插入操作失败,出现SQLITE_FULL错误。如果不 显式插入负ROWID值,然后自动插入 生成的ROWID值将始终大于零。
如果您需要此描述的特定行为,唯一的解决方案是您手动控制表格的KEY_ROWID
,确保正确考虑插入和删除。
答案 3 :(得分:0)
您也可以使用
从SQLite_Sequence
删除您的表格
sqlDb.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME = 'YOUR_TABLE_NAME'");