Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。(getReadableDatabase()方法中会调用getWritableDatabase()方法)

其中getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。

getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。

源码如下:

  1. /**
  2. * Create and/or open a database that will be used for reading and writing.
  3. * Once opened successfully, the database is cached, so you can call this
  4. * method every time you need to write to the database.  Make sure to call
  5. * {@link #close} when you no longer need it.
  6. *
  7. * <p>Errors such as bad permissions or a full disk may cause this operation
  8. * to fail, but future attempts may succeed if the problem is fixed.</p>
  9. *
  10. * @throws SQLiteException if the database cannot be opened for writing
  11. * @return a read/write database object valid until {@link #close} is called
  12. */
  13. public synchronized SQLiteDatabase getWritableDatabase() {
  14. if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) {
  15. return mDatabase;  // The database is already open for business
  16. }
  17. if (mIsInitializing) {
  18. throw new IllegalStateException("getWritableDatabase called recursively");
  19. }
  20. // If we have a read-only database open, someone could be using it
  21. // (though they shouldn't), which would cause a lock to be held on
  22. // the file, and our attempts to open the database read-write would
  23. // fail waiting for the file lock.  To prevent that, we acquire the
  24. // lock on the read-only database, which shuts out other users.
  25. boolean success = false;
  26. SQLiteDatabase db = null;
  27. if (mDatabase != null) mDatabase.lock();
  28. try {
  29. mIsInitializing = true;
  30. if (mName == null) {
  31. db = SQLiteDatabase.create(null);
  32. } else {
  33. db = mContext.openOrCreateDatabase(mName, 0, mFactory);
  34. }
  35. int version = db.getVersion();
  36. if (version != mNewVersion) {
  37. db.beginTransaction();
  38. try {
  39. if (version == 0) {
  40. onCreate(db);
  41. } else {
  42. onUpgrade(db, version, mNewVersion);
  43. }
  44. db.setVersion(mNewVersion);
  45. db.setTransactionSuccessful();
  46. } finally {
  47. db.endTransaction();
  48. }
  49. }
  50. onOpen(db);
  51. success = true;
  52. return db;
  53. } finally {
  54. mIsInitializing = false;
  55. if (success) {
  56. if (mDatabase != null) {
  57. try { mDatabase.close(); } catch (Exception e) { }
  58. mDatabase.unlock();
  59. }
  60. mDatabase = db;
  61. } else {
  62. if (mDatabase != null) mDatabase.unlock();
  63. if (db != null) db.close();
  64. }
  65. }
  66. }
  67. /**
  68. * Create and/or open a database.  This will be the same object returned by
  69. * {@link #getWritableDatabase} unless some problem, such as a full disk,
  70. * requires the database to be opened read-only.  In that case, a read-only
  71. * database object will be returned.  If the problem is fixed, a future call
  72. * to {@link #getWritableDatabase} may succeed, in which case the read-only
  73. * database object will be closed and the read/write object will be returned
  74. * in the future.
  75. *
  76. * @throws SQLiteException if the database cannot be opened
  77. * @return a database object valid until {@link #getWritableDatabase}
  78. *     or {@link #close} is called.
  79. */
  80. public synchronized SQLiteDatabase getReadableDatabase() {
  81. if (mDatabase != null && mDatabase.isOpen()) {
  82. return mDatabase;  // The database is already open for business
  83. }
  84. if (mIsInitializing) {
  85. throw new IllegalStateException("getReadableDatabase called recursively");
  86. }
  87. try {
  88. return getWritableDatabase();
  89. } catch (SQLiteException e) {
  90. if (mName == null) throw e;  // Can't open a temp database read-only!
  91. Log.e(TAG, "Couldn't open " + mName + " for writing (will try read-only):", e);
  92. }
  93. SQLiteDatabase db = null;
  94. try {
  95. mIsInitializing = true;
  96. String path = mContext.getDatabasePath(mName).getPath();
  97. db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY);
  98. if (db.getVersion() != mNewVersion) {
  99. throw new SQLiteException("Can't upgrade read-only database from version " +
  100. db.getVersion() + " to " + mNewVersion + ": " + path);
  101. }
  102. onOpen(db);
  103. Log.w(TAG, "Opened " + mName + " in read-only mode");
  104. mDatabase = db;
  105. return mDatabase;
  106. } finally {
  107. mIsInitializing = false;
  108. if (db != null && db != mDatabase) db.close();
  109. }
  110. }

Android getReadableDatabase() 和 getWritableDatabase()的更多相关文章

  1. getReadableDatabase 和 getWritableDatabase的区别

    (1)getWritableDatabase()方法以读写方式打开数据库.一旦数据库的磁盘空间满了,数据库就只能读而不能写,此时用getWritableDatabase()打开数据库就会出错. (2) ...

  2. Android之SqlLite数据库使用

    每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的.与操作系统无关的SQL数据库—SQLite.SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据 ...

  3. 疯狂Android讲义 - 学习笔记(七)

    第8章 Android数据存储与IO  Java IO的数据存储可以移植到Android应用开发上来,Android系统还提供了一些专门的IO API. Android系统内置了SQLite数据库,S ...

  4. Android中的数据保存

    形式 Android的数据保存分为3种形式:file, SharedPreference, Database 文件 主要思想就是通过Context类中提供的openFileInput和openFile ...

  5. Android SQLiteOpenHelper类的使用

    SQLiteOpenHelper类是Android平台提供的用于SQLite数据库的创建.打开以及版本管理的帮助类.一般需要继承并这个类并实现它的onCreate和onUpgrade方法,在构造方法中 ...

  6. Android入门(十)SQLite创建升级数据库

    原文链接:http://www.orlion.ga/603/ 一.创建数据库 Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, 借助这个类就可 ...

  7. Android入门(十一)SQLite CURD

    原文链接:http://www.orlion.ga/594/ 一.添加数据 SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法 ...

  8. 67.Android中的数据存储总结

    转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d0 ...

  9. Android本地数据存储之SQLite关系型数据库 ——SQLiteDatabase

    数据库的创建,获取,执行sql语句: 框架搭建:dao 思考: 1.数据库保存在哪里? 2.如何创建数据库?如何创建表? 3.如何更新数据库?如何更改表的列数据? 4.如何获取数据库? 5.如何修改数 ...

随机推荐

  1. [C#]6.0新特性浅谈

    原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...

  2. 图片和提交servlet的相对和绝对路径

    xx.jsp在根目录下,图片的路径为:<img height="33" src="images/enter.gif" width="148&qu ...

  3. 960 grid 使用

    去官网下载960 grid,解压后可以看到css下面有如下文件: 960.css是一个综合性文件.我们要引入960 ,reset和text 3 个文件. 一般情况下调用: <link rel=” ...

  4. rsyslog 读日志文件 ,当rsyslog 中断时,也会丢数据

    rsyslog 日志服务器: [root@dr-mysql01 winfae_log]# grep scan0819 wj-proxy01-catalina.out.2016-08-19 [root@ ...

  5. aix Mysql安装 Oracle官方教程

    http://dev.mysql.com/doc/refman/5.1/en/aix-installation.html   (aix Mysql安装 Oracle官方教程)

  6. linux中ctrl+z、ctrl+d和ctrl+c的区别

    ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用f ...

  7. .net通用权限框架B/S(二) 数据库设计

    1.组织机构---员工是1:n关系 2.角色---员工n:n 3.角色--导航菜单n:n 4.操作权限(id)---导航菜单(prms_id)n:n   [此处是n:n关系正常是生成第三张表存放多对多 ...

  8. hive 配置MySQL库

    chkconfig mysqld on MySQL开机自启动 建库: --hive数据库2create database hive DEFAULT CHARSET utf8 COLLATE utf8_ ...

  9. c++常用IDE

    vs2013. CodeLite (c/c++/PHP) codeBlocks Qt Creator Xcode

  10. QF——iOS沙盒机制

    iOS沙盒机制: 什么是沙盒机制?  点击进入  点击进入 沙盒机制(SandBox)是一种安全体系,它规定了APP的所有文件数据都必须存储在这片区域.所有非代码文件的数据都保存在这片区域. 沙盒里有 ...