4

アセット フォルダーに保存されたローカル データベースを使用するアプリ v1.0 があります... アプリをバージョン 1.1 に更新しました。新しいバージョンでは、内部データベースに異なるエントリがあります。

残念ながら、インストールされたアプリは引き続きバージョン 1.0 のデータベースを使用します。最新バージョンのデータベースを使用するには、アプリをアンインストールしてから再度インストールする必要があります。

購入者がアプリケーションをアンインストールして新しいバージョンを再インストールすることを強制するのは、本当に悪いことですか? アセット ファイルが新しいバージョンで更新されないのはなぜですか?

編集

データベースがアセットファイルから作成され、まだ作成されていない場合にのみ、これが私の DatabaseHelper クラスであるため、この問題が発生することを理解しました

public class DataBaseHelper extends SQLiteOpenHelper {
    private static String TAG = "DataBaseHelper"; 
    private static String DB_PATH = "";
    private static String DB_NAME = "MyDatabaseFile";
    private SQLiteDatabase mDataBase;
    private final Context mContext;

    public DataBaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
        this.mContext = context;
    }

    public void createDataBase() throws IOException {
        // If database not exists copy it from the assets

        boolean mDataBaseExist = checkDataBase();
        if (!mDataBaseExist) {
            this.getReadableDatabase();
            this.close();
            try {
                copyDataBase();
                Log.e(TAG, "createDatabase database created");
            } catch (IOException mIOException) {
                throw new Error("ErrorCopyingDataBase");
            }
        }
    }

    private boolean checkDataBase() {
        File dbFile = new File(DB_PATH + DB_NAME);
        // Log.v("dbFile", dbFile + "   "+ dbFile.exists());
        return dbFile.exists();
    }


    private void copyDataBase() throws IOException {
        InputStream mInput = mContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream mOutput = new FileOutputStream(outFileName);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer)) > 0) {
            mOutput.write(mBuffer, 0, mLength);
        }
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }

    public boolean openDataBase() throws SQLException {
        String mPath = DB_PATH + DB_NAME;
        // Log.v("mPath", mPath);
        mDataBase = SQLiteDatabase.openDatabase(mPath, null,
                SQLiteDatabase.CREATE_IF_NECESSARY);
        // mDataBase = SQLiteDatabase.openDatabase(mPath, null,
        // SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        return mDataBase != null;
    }

    @Override
    public synchronized void close() {
        if (mDataBase != null)
            mDataBase.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

}

db ファイルの名前を変更せずに、PlayStore でアプリをアップグレードするときに、この問題を回避するにはどうすればよいですか?

4

2 に答える 2

5

アセットフォルダーに保存されたローカルデータベースを使用するアプリ v1.0 があります

いいえ、「資産フォルダーに保存された」データベースをコピーし、そこからローカル データベースを作成するアプリ v1.0 があります。うまくいけば、これに使用できますSQLiteAssetHelper

アセット ファイルが新しいバージョンで更新されないのはなぜですか?

アセット ファイル更新されます。作成したコピーを修正するために何もしていません。を使用する場合SQLiteAssetHelperは、そのようなアップグレードを処理するための手順があります。

于 2013-01-09T23:28:27.237 に答える
0

データベースに変更を加えるたびに、DBヘルパークラスのDATABASE_VERSIONパラメーターを更新していますか?それを確認します。これは通常、次のようなヘルパークラスで定義されます。

private static final int DATABASE_VERSION = 1;
于 2013-01-09T23:19:45.947 に答える