getReadableDatabase、getWritableDatabase以及数据库版本升级
2014-11-30 12:41
381 查看
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。
getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才以只读方式打开数据库。
getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,getWritableDatabase()打开
数据库就会出错。
getReadableDatabase()方法先以读写方式打开数据库,倘若数据库的磁盘空间满了,打开失败,当打开失败后会继续尝试以只读方式打开数据库。
getWritableDatabase()会调用openOrCreateDatabase打开或者创建数据库,然后检查数据库的版本,如果数据库刚创建,则调用继承自SQLiteDatabase的类的onCreate做相应初始化;如果发现应用已经升级了数据库版本,则会调用继承自SQLiteDatabase的类的onUpgrade更新数据库。
源码如下:
参考文章:
Android中SQLite应用详解
http://blog.csdn.net/liuhe688/article/details/6715983#
getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才以只读方式打开数据库。
getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,getWritableDatabase()打开
数据库就会出错。
getReadableDatabase()方法先以读写方式打开数据库,倘若数据库的磁盘空间满了,打开失败,当打开失败后会继续尝试以只读方式打开数据库。
getWritableDatabase()会调用openOrCreateDatabase打开或者创建数据库,然后检查数据库的版本,如果数据库刚创建,则调用继承自SQLiteDatabase的类的onCreate做相应初始化;如果发现应用已经升级了数据库版本,则会调用继承自SQLiteDatabase的类的onUpgrade更新数据库。
源码如下:
public synchronized SQLiteDatabase getWritableDatabase() { if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) { // 如果mDatabase不为空已打开并且不是只读模式 则返回该实例 return mDatabase; } if (mIsInitializing) { throw new IllegalStateException("getWritableDatabase called recursively"); } // If we have a read-only database open, someone could be using it // (though they shouldn't), which would cause a lock to be held on // the file, and our attempts to open the database read-write would // fail waiting for the file lock. To prevent that, we acquire the // lock on the read-only database, which shuts out other users. boolean success = false; SQLiteDatabase db = null; // 如果mDatabase不为空则加锁 阻止其他的操作 if (mDatabase != null) mDatabase.lock(); try { mIsInitializing = true; if (mName == null) { db = SQLiteDatabase.create(null); } else { // 打开或创建数据库 db = mContext.openOrCreateDatabase(mName, 0, mFactory); } // 获取数据库版本(如果刚创建的数据库,版本为0) int version = db.getVersion(); // 比较版本(我们代码中的版本mNewVersion为1) if (version != mNewVersion) { db.beginTransaction();// 开始事务 try { if (version == 0) { // 执行我们的onCreate方法 onCreate(db); } else { // 如果我们应用升级了mNewVersion为2,而原版本为1则执行onUpgrade方法 onUpgrade(db, version, mNewVersion); } db.setVersion(mNewVersion);// 设置最新版本 db.setTransactionSuccessful();// 设置事务成功 } finally { db.endTransaction();// 结束事务 } } onOpen(db); success = true; return db;// 返回可读写模式的数据库实例 } finally { mIsInitializing = false; if (success) { // 打开成功 if (mDatabase != null) { // 如果mDatabase有值则先关闭 try { mDatabase.close(); } catch (Exception e) { } mDatabase.unlock();// 解锁 } mDatabase = db;// 赋值给mDatabase } else { // 打开失败的情况:解锁、关闭 if (mDatabase != null) mDatabase.unlock(); if (db != null) db.close(); } } }
public synchronized SQLiteDatabase getReadableDatabase() { if (mDatabase != null && mDatabase.isOpen()) { // 如果发现mDatabase不为空并且已经打开则直接返回 return mDatabase; } if (mIsInitializing) { // 如果正在初始化则抛出异常 throw new IllegalStateException("getReadableDatabase called recursively"); } // 开始实例化数据库mDatabase try { // 注意这里是调用了getWritableDatabase()方法 return getWritableDatabase(); } catch (SQLiteException e) { if (mName == null) throw e; // Can't open a temp database read-only! Log.e(TAG, "Couldn't open " + mName + " for writing (will try read-only):", e); } // 如果无法以可读写模式打开数据库 则以只读方式打开 SQLiteDatabase db = null; try { mIsInitializing = true; String path = mContext.getDatabasePath(mName).getPath();// 获取数据库路径 // 以只读方式打开数据库 db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY); if (db.getVersion() != mNewVersion) { throw new SQLiteException("Can't upgrade read-only database from version " + db.getVersion() + " to " + mNewVersion + ": " + path); } onOpen(db); Log.w(TAG, "Opened " + mName + " in read-only mode"); mDatabase = db;// 为mDatabase指定新打开的数据库 return mDatabase;// 返回打开的数据库 } finally { mIsInitializing = false; if (db != null && db != mDatabase) db.close(); } }
参考文章:
Android中SQLite应用详解
http://blog.csdn.net/liuhe688/article/details/6715983#
相关文章推荐
- Android数据库(1)--getReadableDatabase() 和 getWritableDatabase()
- Android SQLite数据库—getWritableDatabase()和getReadableDatabase()区别
- Android数据库中getReadableDatabase() 和 getWritableDatabase()的区别
- getWritableDatabase()和getReadableDatabase()方法区别
- getReadableDatabase() 和 getWritableDatabase()
- Android-getWritableDatabase()与getReadableDatabase()
- getReadableDatabase getWritableDatabase
- Android Studio——getWritableDatabase()和getReadableDatabase()的区别
- Android:getWritableDatabase/getReadableDatabase无法调用onCreate
- getWritableDatabase()和getReadableDatabase()方法区别
- getWritableDatabase()和getReadableDatabase()的区别
- Android 有关SQLite的使用以及数据库版本的升级
- getWritableDatabase()和getReadableDatabase()方法区别
- getWritableDatabase()和getReadableDatabase()的区别
- getReadableDatabase() 和 getWritableDatabase()
- Android测试文件与调用getreadableDatabase()方法数据库创建
- getWritableDatabase与getReadableDatabase的用法区别
- getWritableDatabase()与getReadableDatabase()的区别:
- Android Sqlite 之 getWritableDatabase()和getReadableDatabase()区别
- android SQLite getWritableDatabase VS getReadableDatabase