/* * 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
时间: 2024-10-27 22:10:43