从数据库中删除所有数据时如何重置自动增量int?

时间:2013-03-15 19:15:33

标签: android database sqlite

这是我的数据库

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之间没有差距。

4 个答案:

答案 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'");