2

这是我的数据库

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);

    }

在这里使用我删除的数据,但增加的行 ID 仍然存在,我想将其重置为 1,因为如果我删除特定数据,行 ID 也会按顺序更改它的值,因此数据也被删除,应该没有间隙行 ID 之间。

4

4 回答 4

2

我不认为这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();
于 2013-03-15T19:31:37.673 回答
2

SQLite 在特殊的 SQLITE_SEQUENCE 表中保留最大的 ROWID。您可以将该表删除为:

db.delete("SQLITE_SEQUENCE","NAME = ?",new String[]{TABLE_NAME});
于 2014-07-08T06:40:58.753 回答
1

不幸的是,SQLiteAUTOINCREMENT不能保证按你的意愿工作。引用文档

如果插入时没有指定 ROWID,或者指定的 ROWID 的值为 NULL,则会自动创建适当的 ROWID。通常的算法是给新创建的行一个比插入前表中最大的 ROWID 大一的 ROWID。如果表最初为空,则使用 1 的 ROWID。如果最大的 ROWID 等于最大可能的整数 (9223372036854775807),则数据库引擎开始随机挑选正候选 ROWID,直到找到以前未使用的 ROWID。如果在合理的尝试次数后找不到未使用的 ROWID,则插入操作将失败并出现 SQLITE_FULL 错误。如果没有显式插入负 ROWID 值,则自动生成的 ROWID 值将始终大于零。

如果您需要您描述的这种特定行为,唯一的解决方案是您手动控制KEY_ROWID您的表,确保您正确考虑插入和删除。

于 2013-03-15T19:24:37.357 回答
0

您还可以从SQLite_Sequence使用中删除您的表

sqlDb.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME = 'YOUR_TABLE_NAME'");
于 2018-02-09T08:16:56.583 回答