34. db.beginTransaction();// 开始事务 35. try {
36. if (version == 0) {
37. // 执行我们的onCreate方法 38. onCreate(db); 39. } else {
40. // 如果我们应用升级了mNewVersion为2,而原版本为1则执
行onUpgrade方法
41. onUpgrade(db, version, mNewVersion); 42. }
43. db.setVersion(mNewVersion);// 设置最新版本 44. db.setTransactionSuccessful();// 设置事务成功 45. } finally {
46. db.endTransaction();// 结束事务 47. } 48. } 49.
50. onOpen(db); 51. success = true;
52. return db;// 返回可读写模式的数据库实例 53. } finally {
54. mIsInitializing = false; 55. if (success) { 56. // 打开成功
57. if (mDatabase != null) {
58. // 如果mDatabase有值则先关闭 59. try {
60. mDatabase.close(); 61. } catch (Exception e) { 62. }
63. mDatabase.unlock();// 解锁 64. }
65. mDatabase = db;// 赋值给mDatabase 66. } else {
67. // 打开失败的情况:解锁、关闭
68. if (mDatabase != null) 69. mDatabase.unlock(); 70. if (db != null) 71. db.close(); 72. } 73. } 74. }
users.
public synchronized SQLiteDatabase getWritableDatabase() {
if (mDatabase != null && mDatabase.isOpen() }
if (mIsInitializing) { }
// If we have a read-only database open, someone could // (though they shouldn't), which would cause a lock to // the file, and our attempts to open the database // fail waiting for the file lock. To prevent that, we // lock on the read-only database, which shuts out other
throw new
// 如果mDatabase不为空已打开并且不是只读模式 return mDatabase;
&& !mDatabase.isReadOnly()) { 则返回该实例
IllegalStateException(\
be using it be held on read-write would acquire the
boolean success = false; SQLiteDatabase db = null;
// 如果mDatabase不为空则加锁 阻止其他的操作 if (mDatabase != null)
方法
try {
mDatabase.lock(); mIsInitializing = true; if (mName == null) { }
// 获取数据库版本(如果刚创建的数据库,版本为0) int version = db.getVersion();
// 比较版本(我们代码中的版本mNewVersion为1) if (version != mNewVersion) { }
} finally { }
db.endTransaction();// 结束事务
db.beginTransaction();// 开始事务 try {
if (version == 0) { }
db.setVersion(mNewVersion);//
// 执行我们的onCreateonCreate(db); // 如果我们应用升级了onUpgrade(db, version,
db = SQLiteDatabase.create(null); // 打开或创建数据库 db =
} else {
mContext.openOrCreateDatabase(mName, 0, mFactory);
} else {
mNewVersion为2,而原版本为1则执行onUpgrade方法 mNewVersion);
设置最新版本
db.setTransactionSuccessful();// 设置事务成功
}
}
onOpen(db); success = true;
return db;// 返回可读写模式的数据库实例 mIsInitializing = false; if (success) { }
// 打开成功
if (mDatabase != null) { }
mDatabase = db;// 赋值给mDatabase // 打开失败的情况:解锁、关闭 if (mDatabase != null)
mDatabase.unlock(); db.close();
if (db != null)
// 如果mDatabase有值则先关闭 try { }
mDatabase.unlock();// 解锁
mDatabase.close();
} catch (Exception e) {
} finally {
} else {
大家可以看到,几个关键步骤是,首先判断mDatabase如果不为空已打开并不是只读模式则直接返回,否则如果mDatabase不为空则加锁,然后开始打开或创建数据库,比较版本,根据版本号来调用相应的方法,为数据库设置新版本号,最后释放旧的不为空的mDatabase并解锁,把新打开的数据库实例赋予mDatabase,并返回最新实例。
看完上面的过程之后,大家或许就清楚了许多,如果不是在遇到磁盘空间已满等情况,getReadableDatabase()一般都会返回和getWritableDatabase()一样的数据库实例,所以我们在DBManager构造方法中使用getWritableDatabase()获取整个应用所使用的数据库实例是可行的。当然如果你真的担心这种情况会发生,那么你可以先用getWritableDatabase()获取数据实例,如果遇到异常,再试图用getReadableDatabase()获取实例,当然这个时候你获取的实例只能读不能写了。
最后,让我们看一下如何使用这些数据操作方法来显示数据,下面是MainActivity.java的布局文件和代码:
[html]view plaincopyprint?
1.
2. d\ 3. android:orientation=\ 4. android:layout_width=\ 5. android:layout_height=\> 6.