Android getReadableDatabase() 和 getWritableDatabase()
Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。(getReadableDatabase()方法中会调用getWritableDatabase()方法)
其中getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。
源码如下:
- /**
- * Create and/or open a database that will be used for reading and writing.
- * Once opened successfully, the database is cached, so you can call this
- * method every time you need to write to the database. Make sure to call
- * {@link #close} when you no longer need it.
- *
- * <p>Errors such as bad permissions or a full disk may cause this operation
- * to fail, but future attempts may succeed if the problem is fixed.</p>
- *
- * @throws SQLiteException if the database cannot be opened for writing
- * @return a read/write database object valid until {@link #close} is called
- */
- public synchronized SQLiteDatabase getWritableDatabase() {
- if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) {
- return mDatabase; // The database is already open for business
- }
- 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;
- if (mDatabase != null) mDatabase.lock();
- try {
- mIsInitializing = true;
- if (mName == null) {
- db = SQLiteDatabase.create(null);
- } else {
- db = mContext.openOrCreateDatabase(mName, 0, mFactory);
- }
- int version = db.getVersion();
- if (version != mNewVersion) {
- db.beginTransaction();
- try {
- if (version == 0) {
- onCreate(db);
- } else {
- 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) {
- try { mDatabase.close(); } catch (Exception e) { }
- mDatabase.unlock();
- }
- mDatabase = db;
- } else {
- if (mDatabase != null) mDatabase.unlock();
- if (db != null) db.close();
- }
- }
- }
- /**
- * Create and/or open a database. This will be the same object returned by
- * {@link #getWritableDatabase} unless some problem, such as a full disk,
- * requires the database to be opened read-only. In that case, a read-only
- * database object will be returned. If the problem is fixed, a future call
- * to {@link #getWritableDatabase} may succeed, in which case the read-only
- * database object will be closed and the read/write object will be returned
- * in the future.
- *
- * @throws SQLiteException if the database cannot be opened
- * @return a database object valid until {@link #getWritableDatabase}
- * or {@link #close} is called.
- */
- public synchronized SQLiteDatabase getReadableDatabase() {
- if (mDatabase != null && mDatabase.isOpen()) {
- return mDatabase; // The database is already open for business
- }
- if (mIsInitializing) {
- throw new IllegalStateException("getReadableDatabase called recursively");
- }
- try {
- 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;
- return mDatabase;
- } finally {
- mIsInitializing = false;
- if (db != null && db != mDatabase) db.close();
- }
- }
Android getReadableDatabase() 和 getWritableDatabase()相关推荐
- getReadableDatabase与getWritableDatabase的区别
在Android中,通过getReadableDatabase与getWritableDatabase()都可以获得一个可以对数据库进行操作的实例.然后都可以对数据库进行增.删.查.改.,但是两者也存 ...
- getReadableDatabase() 和 getWritableDatabase()的区别
2019独角兽企业重金招聘Python工程师标准>>> Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于 ...
- getReadableDatabase VS getWritableDatabase
public synchronized SQLiteDatabase getReadableDatabase() {if (mDatabase != null && mDatabase ...
- Android存储方式之SQLite
前言 SQLite数据库操作在Android开发中非常常用 今天我将带大家全面了解关于SQLite数据库的操作(增.删.查.改) 目录 1. SQLite数据库介绍 SQLite是Android内置的 ...
- Android数据存储的三种方式-SharedPrefrences,File,SQLite
1,使用SharedPrefrences 用于简单少量的数据,数据的格式简单:都是普通的字符串,标量类型的值等,比如各种配置信息等等 SharedPrefrences与Editor简介: 创建Shar ...
- Android学习--持久化(三) SQLite LitePal
SQLite & LitePal 自己做为一个iOS开发,看到安卓这一块的时候,那中浓烈的熟悉味道更加强烈,SQLite这种轻量级的关系型数据库的使用在移动端相差不多,iOS有FMDB,And ...
- Android中实现SQLite数据库CRUD操作的两种方式
Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...
- Android学习之SQLite
androidsqlite数据库buttonstringlayout 目录(?)[-] SQLite简介 SQLite使用简介 在DOS环境对SQLite数据库的操作步骤 1.SQLite简介: SQ ...
- Android数据存储之SQLite
概览 l 概述 l CRUD方法详解 l 注意事项 概述 对于大量数据的处理,如果不想将数据存于服务器端,Android API提供了对关系数据库SQLite的支持,在android-SD ...
最新文章
- mxnet makeloss
- codeforces——Little Pony and Expected Maximum
- python手势识别_Python|使用opencv进行简单的手势检测
- matlabapp窗口图像_matlab – 如何自定义App Designer图形的背景?
- PCL “(”:“::”右边的非法标记 和 E2512 功能测试宏的参数必须是简单标识符
- python全局变量的声明和使用_python自学篇(第三章:函数)
- node实现基于token的身份验证
- 浅谈UWB室内定位(二)
- 使用octave符号运算求解不定积分、微分方程等(兼容matlab)
- 圈圈教你玩usb第一版件电子资源使用说明
- win10下如何解决VC++MSDEV.EXE的0xc0000142错误
- 微星主板Ubuntu16.04安装教程
- H3C-H3CNE 华三网络工程师从入门到精通 自学视频课程[肖哥]-肖宗鹏-专题视频课程...
- 计算机考研专业课408什么意思,考研408是什么意思
- Python面向对象加强2.Python 中类的内置属性和内置方法(魔法函数)
- oracle插入新字段脚本
- 用python祝男朋友生日快乐_祝男朋友生日快乐的说说50句
- Linux常用指令(5)——20.4.25
- Vue用图片制作Wifi动态图 制作小喇叭效果
- 聪明好学的王强用计算机设计了,五年级语文下册期中试卷-(1)(1).doc
热门文章
- abaqus python 读取文件_通过Python脚本从Abaqus中的excel文件导入幅度数据
- android 焦点动画,在一个视图/imageview上获得焦点时,实现android缩放动画?_animation_开发99编程知识库...
- 柱形图怎么变成横着的_鞋柜爆满怎么办?来看看日本人怎么收纳鞋子,感觉能多塞下20双...
- xp系统qq安装不上网络连接服务器,windows xp系统不能登录qq的解决方法
- 在的微型计算机系统中 外设可和,微机原理第七章题库
- python如何查询文件路径_Python使用os.listdir和os.walk获取文件路径
- win10 安装vue运行环境
- 利用Python进行数据分析--时间序列
- 手机浏览器网址_你真的会用浏览器搜索吗?几个高阶搜索技巧助您高效找到有用信息
- 简单完整的Python小爬虫教程