3

我正在尝试使用“DELETE FROM SQLITE_SEQUENCE”SQL 语句来重置作为表主键的 _ID rowId 的编号系统。这使得表格的第一行再次为 1。我能够在 java 桌面应用程序中毫无问题地做到这一点,但是在这个 android 应用程序中它不起作用。有任何想法吗?

编辑:我发现并修复了运行时错误。所以我从问题中删除了堆栈跟踪。但是,该部分已修复,现在它不会重置行的编号。当我显示数据库时,它显示相同的编号。例如,如果我删除第 3 行,那么在使用“DELETE FROM SQLITE_SEQUENCE”之后,丢失的第 3 行仍然丢失。运行该 SQL 语句后我还需要做些什么吗?比如重新加载数据库?我不必用java应用程序做到这一点。

从数据库类

 public static final String MYDATABASE_NAME = "my_database";
    public static final String MYDATABASE_TABLE = "my_table";
    public static final int MYDATABASE_VERSION = 1;
    public static final String _ID = "_id";
    public static final String TABLE_STRING = "table_string";
    public static final String PAGE = "page";
    public static final String VERSION = "version";

  //create table MY_DATABASE (_ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_DATABASE =
        "CREATE TABLE IF NOT EXISTS " + MYDATABASE_TABLE + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +  
        TABLE_STRING + " TEXT, " + PAGE + " TEXT, " + VERSION + " TEXT);";

    SQLiteDatabase sqLiteDatabase;
    SQLiteHelper sqLiteHelper;
    Context context;

从数据库类

public void resetRowNumbers(){

             sqLiteDatabase.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME =
          '" + MYDATABASE_TABLE + "'");
         }

来自 MainActivity 类

 public void resetRowNumbering(){
    db = new Database(getApplication());
    db.openToWrite();
    db.resetRowNumbers();
    db.close();
}
4

2 回答 2

1

首先,您不应该删除序列,而是将其重置为零:

"UPDATE sqlite_sequence SET seq = 0 WHERE name=  '" + MYDATABASE_TABLE + "'"

但一般来说,你可能知道这一点,重置序列几乎从来都不是一个好主意。

于 2013-05-20T08:16:36.977 回答
1

这是我发现有效的代码:

 sqLiteDatabase.execSQL("DELETE FROM '" + MYDATABASE_TABLE + "'");
 sqLiteDatabase.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME =
  '" + MYDATABASE_TABLE + "'");

答案是针对上面第一个 SQL 语句的 DELETE 和 FROM 之间有 * 的部分代码。对于 Android,使用 * 不起作用。它会导致运行时错误。尽管事实上它有时会在 SQL 语句的 Internet 示例中显示。它不适用于 Android 版本的 SQLite。

正确的说法是:

 "DELETE FROM '" + MYDATABASE_TABLE + "'"

这将从表中删除所有行。然后在那之后使用:

  "DELETE FROM SQLITE_SEQUENCE WHERE NAME = '" + MYDATABASE_TABLE + "'"

当您输入新行时,这会将主键编号重新设置为从 1 开始。

于 2013-05-20T09:40:19.597 回答