且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

解决sqlite死锁示例异常database is locked

更新时间:2022-09-06 10:21:58

/*
 * 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) {

	}

}

http://download.csdn.net/download/zhiaimm/4513636