我想在sqlite表中删除所有值。
当我点击我的按钮时,它会删除除了它一直计数的ID之外的所有内容
所以例如:
ID, FIRSTNAME, LASTNAME
1, Jack Sparrow
2, Johhny Dep
如果我按删除并添加新值,则显示此
ID, FIRSTNAME, LASTNAME
2, Obama Barack
3, Mike Tyson
这是我的方法
private void DeleteEverything()
{
SQLiteDatabase db = mDbHelper.getWritableDatabase();
db.execSQL("delete from "+NamesContract.NameEntry.TABLE_NAME);
}
答案 0 :(得分:0)
您应该考虑删除并重新创建表格 您可以找到示例here
答案 1 :(得分:0)
如果您指定?? INTEGER PRIMARY KEY
或?? INTEGER PRIMARY KEY AUTOINCREMENT
,则SQlite会以特定方式处理此问题。那是 ?? (在你的情况下看起来是 ID )是SQLite的 rowid 的别名。
rowid 将自动生成,并且通常保证是唯一的,并且通常递增1。但是,不能保证增加或增加1。
如果你指定AUTOINCREMENT
(即上面两个中的后一个),那么保证就是新的 rowid 会更大但不一定是1。
rowid 的值限制为9223372036854775807。如果未使用AUTOINCREMENT
且已达到此限制,则尝试使用空闲数字(例如已删除的行的rowid)。如果指定了AUTOINCREMENT
并且已达到限制,那么插入将失败并出现SQLITE_FULL错误。
因此,在您的情况下,删除行的释放ID将不会被重用。
简而言之,你永远不应该依赖 rowid (或它的别名)列作为特定值,而应该依赖它仅仅是为了唯一标识的目的而成为一个唯一值一行(也许是访问行的最快方式)。
您可以(尽管不建议)设置 rowid ,或者说INSERT INTO mytable (rowid, myothercolumn) VALUES(1, 'other data')
或 ID 已被用作别名INSERT INTO mytable (ID, myothercolumn)VALUES(1, 'other data')
。
如果你确实需要第一行为1然后是2,那么你可以 DROP 表,然后重新创建它而不是删除所有行。例如DROP TABLE mytable
,然后是CREATE TABLE mytable (ID INTEGER PRIMARY KEY, FIRSTNAME TEXT, LASTNAME TEXT)
。但是,我建议你最终会遇到一些问题,这些问题随后会更加难以确定和纠正。
如果你考虑一下,那么Johnny Depp 2 的确是什么意思而不是Barack Obama 2 ?例如,如果它是一个受欢迎程度等级肯定你有一些方法可以直接确定流行度和输入,而不是在其他地方输入它然后用来确定插入顺序,然后进行插入。
以上大部分基本上是SQLite Autoincrement
的摘要作为不可预测性的一个例子,创建了一个表格: -
CREATE TABLE mytable (ID INTEGER PRIMARY KEY, FIRSTNAME TEXT, LASTNAME TEXT)
使用INSERT INTO mytable (ID, FIRSTNAME, LASTNAME) VALUES(9223372036854776000,'FRED','BLOGGS')
插入了一行。请注意使用 9223372036854776000 强制超出限制处理。
然后是一些INSERT INTO mytable(FIRSTNAME, LASTNAME) VALUES('????','????')
插入。注意! 没有 ID,因此使用SQLITE的唯一标识符确定(高于限制 processinmg)。结果表: -
MARY QUITECONTRARY是插入的第二行,TOM SMITH是第三行。两个RICHARD BURTON行是一个示例,其中唯一ID对于确定特定行是必不可少的,两者都插入而未指定插入顺序。
请注意!如果尝试了上述但指定了AUTOINCREMENT
,那么第二个插入和任何后续插入都将失败,并出现SQLITE_FULL错误。