Android(安卓)内存数据库
16lz
2021-12-04
在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");}}}
更多相关文章
- 安装好android的adt以后重启eclipse,但是没有创建AVD的图标
- Android内部数据库
- Android心得4.3--SQLite数据库--execSQL()和rawQuery()方法
- Android的内存管理机制
- android:installLocation简析
- StevGuo系列文章翻译之Android内存泄漏检测
- Android(安卓)创建自定义View 实现TopBar
- [android] android下创建一个sqlite数据库
- Android(安卓)Studio 首次创建工程下载Gradle失败