package com.itap.voiceemoticon.db;
import java.util.HashMap;
import java.util.Iterator;
import android.database.sqlite.SQLiteDatabase;
import com.itap.voiceemoticon.util.FileUtil;
/**
* 缓存数据库链接,避免多线程操作导致崩溃的问题
*
* 一个应用,应确保一个数据库只有一个写链接。 这样可以避免多线程中的产生的各种问题。<br>
* 目前 碰到的问题列表如下:<br>
*
* 1 问题关键字:database is locked. 问题产生原因:多个数据库链接在多线程的环境同时写数据库。
*
*
* @author chenzh
*
*/
public class DbCacheMgr {
/**
* 数据库读链接缓存
*/
private static final HashMap<String, SQLiteDatabase> CACHE_READ_DB = new HashMap<String, SQLiteDatabase>(2);
/**
* 数据库读写链接缓存
*/
private static final HashMap<String, SQLiteDatabase> CACHE_WRITE_DB = new HashMap<String, SQLiteDatabase>(2);
/**
* 获取缓存中的读链接
*
* @param dbPath
* 数据库路径,缓存的key
* @return
*/
public static synchronized SQLiteDatabase getCacheReadDb(String dbPath) {
if (CACHE_READ_DB.containsKey(dbPath)) {
return CACHE_READ_DB.get(dbPath);
} else {
SQLiteDatabase db = null;
try {
db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY);
CACHE_READ_DB.put(dbPath, db);
} catch (Exception e) {
FileUtil.delete(dbPath);
db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY);
CACHE_READ_DB.put(dbPath, db);
}
return db;
}
}
/**
* 获取缓存中的读写数据库链接
*
* @param dbPath
* 数据库路径,缓存的key
* @return
*/
public static synchronized SQLiteDatabase getCacheWriteDb(String dbPath) {
SQLiteDatabase db = null;
if (CACHE_WRITE_DB.containsKey(dbPath)) {
db = CACHE_WRITE_DB.get(dbPath);
} else {
try {
db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY);
CACHE_WRITE_DB.put(dbPath, db);
} catch (Exception e) {
// SQLiteDiskIOException
FileUtil.delete(dbPath);
db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY);
CACHE_WRITE_DB.put(dbPath, db);
}
}
return db;
}
/**
* 关闭数据库
*
* @param db
*/
public static void closeDataBase(SQLiteDatabase db) {
if (db != null && db.isOpen()) {
db.close();
}
}
/**
* 清空数据库链接缓存
*
* @param db
*/
public synchronized static void clearDbCache() {
clearDbCache(CACHE_READ_DB);
clearDbCache(CACHE_WRITE_DB);
}
private static void clearDbCache(HashMap<String, SQLiteDatabase> dbCache) {
try {
if (dbCache == null) {
return;
}
Iterator<String> keyIter = dbCache.keySet().iterator();
while (keyIter.hasNext()) {
SQLiteDatabase db = dbCache.get(keyIter.next());
if (db != null) {
db.close();
}
}
dbCache.clear();
} catch (Exception e) {
e.printStackTrace();
}
}
}