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 ステートメントのインターネットの例で時々示されるという事実にもかかわらずです。Android 版の SQLite では動作しません。

正しいステートメントは次のとおりです。

 "DELETE FROM '" + MYDATABASE_TABLE + "'"

これにより、テーブルからすべての行が削除されます。その後、次を使用します。

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

これにより、新しい行を入力すると、主キーの番号付けが再び 1 から始まるようにリセットされます。

于 2013-05-20T09:40:19.597 に答える