1

Android、ICSでSQLiteを使用しています。更新すると、SQLiteReadOnlyDatabaseException. で作成したので、それは奇妙でしたSQLiteOpenHelper.getWritableDatabase()。また、更新が発生する直前にデータベースが読み取り専用であるかどうかをテストしましたmyDB.isReadonly(). この例外は Gingerbread では発生しません。Androidバージョン間で異なるバージョンのsqliteと関係があると思われます。

データベースを作成するためのコードは次のとおりです。

protected static class DBHelper extends SQLiteOpenHelper {
    DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CreateStatements.CREATE_MOVIES);
...

}

public class DBAdapter {
    public static final String PACKAGE_NAME =     
    protected DBHelper dbHelper;
    protected Context context;
    protected SQLiteDatabase myDB;
    public CreateStatements statement;

    public DBAdapter(Context context) {
        this.context = context;
    }

    public void open() throws SQLException {
        dbHelper = new DBHelper(context);
        myDB = dbHelper.getWritableDatabase();
        myDB.setLockingEnabled(false);
    }

    public void close() {
        myDB.close();
    }
...

}
4

1 に答える 1

0

最近直面しました。これを解決する方法は次のとおりです。

try{
   myDB = dbHelper.getWritableDatabase();
} catch (SQLiteReadOnlyDatabaseException e){
   Log.d(TAG, "SQLiteReadOnlyDatabaseException");
   startActivity(new Intent(context, MainActivity.class));
}

データベースが更新されると、古いデータベースとの接続が保持されます。データベースのアップグレード後にnew DBHelper(context)が再度実行されると、ヘルパーは古いデータベースにリンクします。したがって、このクラスを閉じて再初期化する必要があります。私の場合、MainActivity は dbHelper を最初に初期化したクラスです。したがって、例外がキャッチされてアクティビティが再開されると、古いデータベースへの接続が削除され、正常に動作します。

于 2016-07-20T06:42:49.730 に答える