Android中SQLite应用详解(5)

2019-01-26 21:52

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.

Android中SQLite应用详解(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:新环保法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: