9

SQLiteデータベースを正常に作成しましたが、正常に動作します。ただし、onUpgradeメソッドを呼び出すときは、データを失わずに呼び出したいと思います。私が開発しているアプリはクイズアプリです。簡単に言うと、onCreateメソッドが呼び出されると、データベースを作成して、質問や回答などを事前に入力します。最後の列は、質問をお気に入りとして設定したかどうかです。私がやりたいのは、onUpgradeメソッドが呼び出されたときに、その1つの列を一時的に保存し、データベース全体を削除し、古い質問に対して行った編集で再作成し、新しい質問を追加してから再作成することです。 -彼らがお気に入りとして設定した質問を追加し直します。

だから私が試した1つのオプションは次のとおりでした:

db.execSQL("ALTER TABLE quiz RENAME TO temp_quiz");
onCreate(db);
db.execSQL("INSERT INTO quiz (favouries) SELECT favourites FROM temp_quiz");
db.execSQL("DROP TABLE IF EXISTS temp_quiz");

ただし、INSERT INTOは既存の行を置き換えるのではなく、新しい行を追加するだけなので、これは機能しません。また、REPLACE INTO、INSERT OR REPLACE INTO、および

db.execSQL("INSERT INTO quiz (_id, favouries) SELECT _id, favourites FROM temp_quiz");

そのうちどれも機能しません。

現在、テーブルの名前を変更し、onCreate(db)メソッドを呼び出してから、次のように各行を読み取り、db.update()メソッドを使用するカーソルを設定することで動作するように設定しています。

int place = 1;
int TOTAL_NUMBER_OF_ROWS = 500;

while (place < TOTAL_NUMBER_OF_ROWS) {

String[] columns = new String[] { "_id", ..........., "FAVOURITES" };
// not included all the middle columns

Cursor c = db.query("temp_quiz", columns, "_id=" + place, null, null, null, null);

c.moveToFirst(); 

String s = c.getString(10);
// gets the value from the FAVOURITES column


ContentValues values = new ContentValues(); 
values.put(KEY_FLAG, s);

String where = KEY_ROWID + "=" + place;

db.update(DATABASE_TABLE, values, where, null);

place++;

c.close();

}

ただし、これは機能しますが、非常に遅く、質問の数が増えるにつれて悪化するだけです。これをすべて行う簡単な方法はありますか?

ありがとうございました!PS理想的には、行が存在する場合にのみ行を更新する必要があります。したがって、アップグレードで質問を削除することにした場合は、これを考慮に入れて、行に他のデータが含まれていない場合は新しい行を追加しないでください。質問データが追加されないようにするよりも、質問データがない行を削除する方が簡単な場合があります。

4

6 に答える 6

4

それを次のように変更しました:

db.execSQL("UPDATE new_quiz SET favourites = ( SELECT old_quiz.favourites 
FROM old_quiz WHERE new_quiz._id = old_quiz._id) WHERE EXISTS 
( SELECT old_quiz.favourites FROM old_quiz WHERE new_quiz._id = old_quiz._id)");

どちらが機能しますか:D

于 2012-10-25T18:29:39.877 に答える
1

たとえば、データベース スキーマをアップグレードするときに SQLite のバージョンをアップグレードする方法をまだ知らない人は、needUpgrade(int newVersion) メソッドを使用してください。

私のコード:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

     if(newVersion>oldVersion){

         db.execSQL(scriptUpdate);
         db.needUpgrade(newVersion);
     }

}
于 2014-06-12T06:31:23.197 に答える
1

Quiz テーブル スキーマは確認できませんでしたが、「質問」、「回答」、「お気に入り」などのフィールドと、各質問を識別するための何らかの一意の主キー (rowId と呼びます) があると思います。今のところ。

// after renaming the old table and adding the new table
db.execSQL("UPDATE new_quiz SET new_quiz.favorites = old_quiz.favorites where new_quiz.rowId = old_quiz.rowId");

これにより、古いクイズ テーブルと一致する新しいクイズ テーブルの行のみが更新され、古いクイズ テーブルからお気に入りの値が設定されます。

各質問を識別するための何らかの一意の識別子があると想定しているため、上記の rowId の代わりにそれ (質問番号など) を使用します。

于 2012-10-24T00:23:24.073 に答える