zoukankan      html  css  js  c++  java
  • 【安卓面试题】使用SQLiteOpenHelper的getReadableDatabase()获得的数据库能不能,做写的操作

    可以! 不要被Readable的意思误导啦,readable是可读的意思,但不代表不能写哦。 

    getReadableDatabase() 会获取用于操作SQLiteDatabase的实例。 

    getReadableDatabase()会先以读写方式打开数据库,若数据库磁盘空间满了,打开失败,会继续尝试以只读方式打开。

    若磁盘空间有了,会关闭只读数据库对象,返回可读写数据库对象。 

    getWriteableDatabase()也是会以读写方式打开数据库,如果磁盘满了,会抛异常,不会返回数据库对象。

    查看源码,发现getReadableDatabase()和getWriteableDatabase()都是调用getDatabaseLocked(boolean writeable) 方法,传不同的参数。

    以下是部分源码。 观察源码,发现getReadableDatabase()会在抛异常的时候以只读模式打开数据库。而getWritableDatabase()不会

    SQLiteDatabase db = mDatabase;
    try {
    mIsInitializing = true;

    if (db != null) {
    if (writable && db.isReadOnly()) {
    db.reopenReadWrite();
    }
    } else if (mName == null) {
    db = SQLiteDatabase.create(null);
    } else {
    try {
    if (DEBUG_STRICT_READONLY && !writable) {
    final String path = mContext.getDatabasePath(mName).getPath();
              //如果是read,打开只读数据库
    db = SQLiteDatabase.openDatabase(path, mFactory,
    SQLiteDatabase.OPEN_READONLY, mErrorHandler);
    } else {
    db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?
    Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0,
    mFactory, mErrorHandler);
    }
    } catch (SQLiteException ex) {
           //如果是write,抛异常
    if (writable) {
    throw ex;
    }
    Log.e(TAG, "Couldn't open " + mName
    + " for writing (will try read-only):", ex);
    final String path = mContext.getDatabasePath(mName).getPath();
           //打开只读数据库
    db = SQLiteDatabase.openDatabase(path, mFactory,
    SQLiteDatabase.OPEN_READONLY, mErrorHandler);
    }
    }
    ......
    finally {
    mIsInitializing = false;
    if (db != null && db != mDatabase) {
    db.close(); //如果要返回数据库对象,关闭其他打开过的数据库对象
    }
  • 相关阅读:
    SublimeText3激活
    Mysql数据备份
    supervisor介绍与使用
    spark-submit介绍
    Spark之spark.sql
    MarkDown编写方法
    Nginx配置多级代理后获取用户真实IP
    Hive之UDF解释
    Hive之分组取前几条记录
    Hive之Map和Reduce的优化
  • 原文地址:https://www.cnblogs.com/yidan621/p/5665815.html
Copyright © 2011-2022 走看看