在android中数据库通常以文件的形式存储在磁盘中,而内存数据库是将数据驻留在内存中,因此可以作为一种缓存技术方案。 那么在android如何使用sqlite的内存数据库呢?
看SQLiteDatabase的源码:
/** * Create a memory backed SQLite database. Its contents will be destroyed * when the database is closed. * * <p>Sets the locale of the database to the the system‘s current locale. * Call {@link #setLocale} if you would like something else.</p> * * @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); } } @Override protected 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"); } } }
本文出自 “ITLIFE” 博客,请务必保留此出处http://xwteacher.blog.51cto.com/9653444/1584554
原文地址:http://xwteacher.blog.51cto.com/9653444/1584554