android.database.sqlite.SQLiteException: невозможно обновить базу данных только для чтения с версии 0 до 2 - PullRequest
0 голосов
/ 03 ноября 2019

Так что я не могу обновить свою БД по какой-то причине. Мне не нужно сохранять мои предыдущие базы данных, пользователь не меняет их, поэтому все, что мне нужно, это просто заменить их. Вот код, который, кажется, не работает. В onCreate () моей Деятельности я делаю это

private AchieveDbHelper mDBHelper;

mDBHelper = new AchieveDbHelper(this);
    try {
        mDBHelper.updateDataBase();
    } catch (IOException mIOException) {
        throw new Error("UnableToUpdateDatabase");
    }

Вот код AchieveDbHelper

public class AchieveDbHelper extends SQLiteOpenHelper {
private static String DB_NAME = "achievements.db";
private static String DB_PATH = "";
private static final int DB_VERSION = 2;

private SQLiteDatabase mDataBase;
private final Context mContext;
private boolean mNeedUpdate = false;

public AchieveDbHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    if (android.os.Build.VERSION.SDK_INT >= 17)
        DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    else
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    this.mContext = context;

    copyDataBase();
    this.getReadableDatabase();
}

public void updateDataBase() throws IOException {
    if (mNeedUpdate) {
        File dbFile = new File(DB_PATH + DB_NAME);
        if (dbFile.exists())
            dbFile.delete();
        copyDataBase();
        mNeedUpdate = false;
    }
}

private boolean checkDataBase() {
    File dbFile = new File(DB_PATH + DB_NAME);
    return dbFile.exists();
}

private void copyDataBase() {
    if (!checkDataBase()) {
        this.getReadableDatabase();
        this.close();
        try {
            copyDBFile();
        } catch (IOException mIOException) {
            throw new Error("ErrorCopyingDataBase");
        }
    }
}

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

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

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (newVersion > oldVersion)
        mNeedUpdate = true;
}

Я пробовал разные решения в onUpgrade, но они тоже не работали.

...