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