栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android getReadableDatabase() 和 getWritableDatabase()分析对比

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android getReadableDatabase() 和 getWritableDatabase()分析对比

Android getReadableDatabase() 和 getWritableDatabase()分析对比

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

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

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

源码如下:

 
  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(); 
      } 
    } 
  } 
 
   
  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(); 
    } 
  } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/158495.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号