在android中数据库通常以文件的形式存储在磁盘中,而内存数据库是将数据驻留在内存中,因此可以作为一种缓存技术方案。 那么在android如何使用sqlite的内存数据库呢?

看SQLiteDatabase的源码:


/***CreateamemorybackedSQLitedatabase.Itscontentswillbedestroyed*whenthedatabaseisclosed.**<p>Setsthelocaleofthedatabasetothethesystem'scurrentlocale.*Call{@link#setLocale}ifyouwouldlikesomethingelse.</p>**@paramfactoryanoptionalfactoryclassthatiscalledtoinstantiatea*cursorwhenqueryiscalled*@returnaSQLiteDatabaseobject,ornullifthedatabasecan'tbecreated*/publicstaticSQLiteDatabasecreate(CursorFactoryfactory){//ThisisamagicstringwithspecialmeaningforSQLite.returnopenDatabase(MEMORY_DB_PATH,factory,CREATE_IF_NECESSARY);}


CREATE_IF_NECESSARY 表示:当数据库不存在时将被创建。 通过方法注释可以知道此方法可以创建内存数据库,并当数据库关闭时数据将被清除。


另外一种方法,请看SQLiteOpenHelper源码:


publicsynchronizedSQLiteDatabasegetWritableDatabase(){booleansuccess=false;SQLiteDatabasedb=null;if(mDatabase!=null)mDatabase.lock();try{mIsInitializing=true;if(mName==null){db=SQLiteDatabase.create(null);}else{db=mContext.openOrCreateDatabase(mName,0,mFactory,mErrorHandler);}...onOpen(db);success=true;returndb;}finally{mIsInitializing=false;if(success){if(mDatabase!=null){try{mDatabase.close();}catch(Exceptione){}mDatabase.unlock();}mDatabase=db;}else{if(mDatabase!=null)mDatabase.unlock();if(db!=null)db.close();}}}


从代码中可以知道,当mName(数据库名称)为null时,将创建内存数据库。


我写了一个demo请看代码:


packagedw.test;importandroid.content.ContentValues;importandroid.database.Cursor;importandroid.database.sqlite.SQLiteDatabase;importandroid.provider.BaseColumns;importandroid.util.Log;publicfinalclassMemoryDbTester{privatestaticfinalStringLOG_TAG=MemoryDbTester.class.getSimpleName();privatestaticfinalStringTABLE_NAME="t_user";privateSQLiteDatabasemMemoryDb;privateMemoryDbTester(){mMemoryDb=createMemoryDb();}privatestaticMemoryDbTestersDefault=newMemoryDbTester();publicstaticMemoryDbTestergetDefault(){returnsDefault;}publicinterfaceColumnsextendsBaseColumns{publicstaticfinalStringUNAME="uname";}/***创建内存数据库*/privateSQLiteDatabasecreateMemoryDb(){SQLiteDatabasedatabase=SQLiteDatabase.create(null);Stringt_user_sql="CREATETABLE"+TABLE_NAME+"(_idintegerprimarykeyautoincrement,"+Columns.UNAME+"varchar(10))";database.execSQL(t_user_sql);returndatabase;}/***向内存数据库中插入一条数据*/publicvoidtestInsert(){SQLiteDatabasedb=mMemoryDb;check(db);ContentValuesvalues=newContentValues();values.put(Columns.UNAME,"dw");db.insert(TABLE_NAME,null,values);}/***查询内存数据库中的数据*/publicvoidtestQuery(){SQLiteDatabasedb=mMemoryDb;check(db);Cursorc=db.rawQuery("selectunamefromt_user",null);while(c.moveToNext()){Stringname=c.getString(0);Log.i(LOG_TAG,"NAME:"+name);}}@Overrideprotectedvoidfinalize()throwsThrowable{releaseMemory();super.finalize();}publicvoidreleaseMemory(){SQLiteDatabasedb=mMemoryDb;if(db!=null){db.close();mMemoryDb=null;}}privatevoidcheck(SQLiteDatabasedb){if(db==null||!db.isOpen()){thrownewIllegalStateException("memorydatabasealreadyclosed");}}}


更多相关文章

  1. 安装好android的adt以后重启eclipse,但是没有创建AVD的图标
  2. Android内部数据库
  3. Android心得4.3--SQLite数据库--execSQL()和rawQuery()方法
  4. Android的内存管理机制
  5. android:installLocation简析
  6. StevGuo系列文章翻译之Android内存泄漏检测
  7. Android(安卓)创建自定义View 实现TopBar
  8. [android] android下创建一个sqlite数据库
  9. Android(安卓)Studio 首次创建工程下载Gradle失败

随机推荐

  1. CentOS7.6修改主机名称hostname
  2. JAVA开发ORACLE的规范
  3. MySQL的SQL语句 - 数据定义语句(18)- RENAM
  4. 小白之路---C语言
  5. GitHub 标星 1.3w+,这可能是我见过最好的
  6. CISSP学习:第20章软开开发安全
  7. C语言
  8. 扎心一问:前后端分离开发,RESTful 接口要怎
  9. C语言学习第八天【函数递归】
  10. 2021-03-06:go中,公共变量是协程安全吗?赋值