674
小米淨水器
解決sqlite死鎖示例異常database is locked
/*
* sqlite的連接方式實際上為單連接方式,即使實用多線程也是用的一個連接
* getWritableDatabase()和getReadableDatabase()都為synchronized方法,但不是static方法
* 所以都隻對同一個對象起同步作用,對於不同的對象沒有任何作用
* 所以使用sqlite的時候可以提供一個單一的入口,防止多對象修改數據庫而造成死鎖
* 所以可以提供一個static的instance對象+它的get方法,
* 連接可一直掛著,即使多次調用getWritableDatabase()和/或getReadableDatabase()方法也沒關係,
* 因為你隻是在獲得一個已有的連接而已
* 數據庫不用關閉,退出程序,係統會自動回收
* 其實最主要就是synchronized關鍵字的作用範圍的問題
* 不過使用一個對象不知道會不會影響程序效率
*/
package test.service;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME="boc.db";
private static final int DATABASE_VERSION = 1;
/*私有的靜態對象,為整個應用程序提供一個sqlite操作的靜態實例,並保證隻能通過下麵的靜態方法getHelper(Context context)獲得,
* 防止使用時繞過同步方法改變它*/
private static DBHelper instance;//這裏主要解決死鎖問題,是static就能解決死鎖問題
/**
* 私有的構造函數,隻能自己使用,防止繞過同步方法生成多個實例,
* @param context
*/
private DBHelper(Context context) {
super(context, DB_NAME, null, DATABASE_VERSION);
}
/**
* 為應用程序提供一個單一的入口,保證應用程序使用同一個對象操作數據庫,不會因為對象不同而使同步方法失效
* @param context 上下文
* @return instance
*/
public static DBHelper getHelper(Context context){
if(instance==null)
instance=new DBHelper(context);
return instance;
}
@Override
public void onCreate(SQLiteDatabase db) {
//黃金名稱表
db.execSQL("CREATE TABLE IF NOT EXISTS goldName" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT, G_Name VARCHAR unique)");
//黃金當日曆史信息表
db.execSQL("CREATE TABLE IF NOT EXISTS goldInfo" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT,GI_Tid INTEGER,GI_BidPrice DOUBLE, GI_OfferPrice DOUBLE,"+
"GI_InsertTime time not null default current_time)");
//黃金前次信息表
db.execSQL("CREATE TABLE IF NOT EXISTS gold_lastInfo" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT,GL_Name VARCHAR,GL_BidPrice DOUBLE, GL_OfferPrice DOUBLE)");
//貨幣名稱表
db.execSQL("CREATE TABLE IF NOT EXISTS currencies" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT, C_Name VARCHAR unique)");
//外匯當日曆史信息表
db.execSQL("CREATE TABLE IF NOT EXISTS exchangeInfo" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT,EI_Tid INTEGER,EI_Buying DOUBLE, EI_CashBuying DOUBLE,"+
"EI_Selling DOUBLE,EI_CashSelling DOUBLE,EI_InsertTime time not null default current_time)");
//外匯前次信息表
db.execSQL("CREATE TABLE IF NOT EXISTS exchange_lastInfo" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT,EL_Name VARCHAR,EL_Buying DOUBLE, EL_CashBuying DOUBLE,"+
"EL_Selling DOUBLE,EL_CashSelling DOUBLE)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
https://download.csdn.net/download/zhiaimm/4513636
最後更新:2017-04-03 20:43:08