无法重置SQLite表中的主键编号

时间:2013-05-20 08:11:31

标签: android database sqlite

我正在尝试使用“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;
来自Database类的

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

这是我找到的代码有效:

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

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

正确的陈述是:

 "DELETE FROM '" + MYDATABASE_TABLE + "'"

这将删除表中的所有行。之后使用:

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

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