閱讀674 返回首頁    go 阿裏雲 go 技術社區[雲棲]


解決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

  上一篇:go 我的技術之道
  下一篇:go POJ 2074 線段相交 視線問題