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

看SQLiteDatabase的源码:

/**     * Create a memory backed SQLite database.  Its contents will be destroyed     * when the database is closed.     *     * 

Sets the locale of the database to the the system's current locale. * Call {@link #setLocale} if you would like something else.

* * @param factory an optional factory class that is called to instantiate a * cursor when query is called * @return a SQLiteDatabase object, or null if the database can't be created */ public static SQLiteDatabase create(CursorFactory factory) { // This is a magic string with special meaning for SQLite. return openDatabase(MEMORY_DB_PATH, factory, CREATE_IF_NECESSARY); }

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

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

public synchronized SQLiteDatabase getWritableDatabase() {                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, mErrorHandler);            }            ...            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();            }        }    }

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

我写了一个demo请看代码:

package dw.test;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.provider.BaseColumns;import android.util.Log;public final class MemoryDbTester {private static final String LOG_TAG = MemoryDbTester.class.getSimpleName();private static final String TABLE_NAME = "t_user";private SQLiteDatabase mMemoryDb;private MemoryDbTester(){mMemoryDb = createMemoryDb();}private static MemoryDbTester sDefault = new MemoryDbTester();public static MemoryDbTester getDefault(){return sDefault;}public interface Columns extends BaseColumns {public static final String UNAME = "uname";}/** * 创建内存数据库 */private SQLiteDatabase createMemoryDb(){SQLiteDatabase database = SQLiteDatabase.create(null);String t_user_sql = "CREATE TABLE "+TABLE_NAME+"(_id integer primary key autoincrement,"+Columns.UNAME+" varchar(10))";database.execSQL(t_user_sql);return database;}/** * 向内存数据库中插入一条数据 */public void testInsert() {SQLiteDatabase db = mMemoryDb;check(db);ContentValues values = new ContentValues();values.put(Columns.UNAME, "dw");db.insert(TABLE_NAME, null, values);}/** * 查询内存数据库中的数据 */public void testQuery(){SQLiteDatabase db = mMemoryDb;check(db);Cursor c = db.rawQuery("select uname from t_user", null);while(c.moveToNext()){String name = c.getString(0);Log.i(LOG_TAG, "NAME:" + name);}}@Overrideprotected void finalize() throws Throwable {releaseMemory();super.finalize();}public void releaseMemory(){SQLiteDatabase db = mMemoryDb;if(db!=null){db.close();mMemoryDb = null;}}private void check(SQLiteDatabase db) {if(db==null || !db.isOpen()){throw new IllegalStateException("memory database already closed");}}}




更多相关文章

  1. Android内存管理、监测剖析
  2. (二)Android系统信息
  3. android笔记
  4. android 缓存Bitmap
  5. Android(安卓)内存数据库
  6. Android中SQLite操作示例
  7. Android内存泄漏监测(MAT)及解决办法
  8. Android联系人数据库全解析(5)
  9. Android(安卓)Studio

随机推荐

  1. Android ANR 分析(转载)
  2. 实现三星S3蒲公英水波纹效果(二)——Rend
  3. Android UI开发第三十九篇――Tab界面实
  4. Android 应用界面显示流程
  5. 【Android教程】Android Studio找不到连
  6. 可靠的功能测试--Espresso和Dagger2
  7. 解决 Android(安卓)中使用ListView和Chec
  8. 第一篇 入门必备 (Android学习笔记)
  9. Android进程说明
  10. Eclipse android 项目转android studio填