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