SQLiteReadOnlyDatabaseException但数据库是可写的

时间:2012-10-20 16:25:12

标签: android sqlite android-4.0-ice-cream-sandwich

我在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();
    }
...

}

1 个答案:

答案 0 :(得分:0)

我最近遇到过。以下是如何解决的问题:

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

更新数据库时,它会保留与旧数据库的某些连接。在数据库升级后再次执行new DBHelper(context)时,帮助程序会链接回旧数据库。因此,您需要关闭此类并重新初始化它。在我的例子中,MainActivity是首先初始化dbHelper的类。因此,当捕获异常并重新启动活动时,将删除与旧数据库的连接,并且它可以正常工作。