1

私のアプリでは、アセットフォルダーを介してデータベースの最新バージョンを提供しています。簡単にするために、私のDBスキームがPRIM KEY INTEGER _id、TEXT名、およびINTEGER数量であるとしましょう。ユーザーがアプリで編集できるのは数量だけです。それ以外はすべて静的データです。数量のデフォルトは0です。

これが私が現在onUpgradeでやろうとしていることです:

1.)すべてのテーブルを反復処理し、数量が0より大きいエントリを見つけて、IDと数量の値、および元のテーブル名を保持するオブジェクトのリストにそれらのエントリを格納します。

2.)繰り返したばかりの古いデータベースを削除します

3.)更新された静的情報を含むアセットから新しいデータベースをコピーします。

4.)ステップ1のリストを繰り返し処理し、対応するIDを対応するテーブルの数量で更新します。

これが私のonUpdateメソッドです(titleArrayは私のテーブル名を含む文字列の配列です):

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

    Log.w("TaskDBAdapter", "Upgrading from version " + oldVersion + " to " + newVersion);


    ArrayList<backupKey> bak = new ArrayList<backupKey>();

    Cursor cursor = null;
        for(int i = 0; i < titleArray.length; i++)
        {
             cursor = db.rawQuery("SELECT * FROM " + titleArray[i] + " WHERE quantity > 0", null);
             if (cursor.moveToFirst()){
                   do{
                       backupKey key = new backupKey(titleArray[i],
                               cursor.getInt(cursor.getColumnIndex("_id")),
                               cursor.getInt(cursor.getColumnIndex("quantity")));
                       bak.add(key);

                   }while(cursor.moveToNext());
                }

        }
        cursor.close();

        myContext.deleteDatabase(DB_NAME);

        try 
        {
            InputStream myInput = myContext.getAssets().open(DB_NAME);

            String outFileName = DB_PATH + DB_NAME;

            OutputStream myOutput = new FileOutputStream(outFileName, false);


            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer))>0){
                myOutput.write(buffer, 0, length);
            }

            myOutput.flush();
            myOutput.close();
            myInput.close();

        } catch (IOException e) 
        {
            Log.w("TaskDBAdapter", "failed");
            throw new Error("Error copying database");

        }

    for (int i = 0; i < bak.size(); i++)
    {

        ContentValues args = new ContentValues();
        args.put("quantity", bak.get(i).quantity);
        String where = "_id = ?";
        String[] whereArgs = {Integer.toString(bak.get(i).id)};
        db.update(bak.get(i).range, args, where, whereArgs);
    }

} //End of onUpgrade

arraylistに適切なデータが正常に入力されていることを確認できます。以前はデータベースを上書きしようとしていましたが、うまくいかなかったようです。myContext.deleteDatabase(DB_NAME);を追加する必要がありました。データベースを正常に置き換えるためのファイル書き込み操作の前。最終更新の反復で奇妙なデータが生成されていないことを確認できます。テーブル名、ID、および数量の値が正しいことを確認できます。

問題は、onUpgrade後に数量が更新されないことです。静的データは、アセットフォルダーに含めた最新バージョンに更新されますが、数量データは更新されません。これは、メソッドに最初に提供されたデータベース(この場合は「db」パラメーター)を破棄したためですか?それもパラメータが何であるか?新しいデータベースでデータを更新するにはどうすればよいですか?

また:これについてもっと良い方法があれば、私はすべての耳です=)

4

1 に答える 1

2

onUpgarde()実際のデータではなく、データベース構造の更新 (列の追加/名前変更など) を目的としています。初めて起動するときは、実際のアプリでこれを行うことができます。さらに、ユーザーが入力したデータをその場でアップグレードしようとするのは、最善の方法ではない可能性があります。2 つのテーブル (またはデータベース) を用意しないのはなぜですか? 1 つは提供するデータ、もう 1 つはユーザーが入力したデータです。ユーザーが編集した行を単純にコピーし、元のデータを読み取り専用のままにすることができます。

于 2012-06-14T04:29:44.900 に答える