データベースロック例外が発生するクラス内でシングルトンデータベースオブジェクトを使用すると問題が発生しますが、同じクラスのメソッド内で同じものを使用するとすべて問題なく、動作に混乱します。以下はコードです: データベースクラス: シングルトン機能付き
public class Database extends SQLiteOpenHelper{
private static String dbname="Director";
private static int dbversion=1;
SQLiteDatabase db;
private Context m1Context;
private static Database minstance;
public Database(Context context) {
super(context, dbname, null, dbversion);
// TODO Auto-generated constructor stub
}
public synchronized static Database getInstance(Context m1Context){
if (minstance==null){
minstance=new Database(m1Context);
}
return minstance;
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
STable st=new StockTable(m1Context);
BTable bt=new BrokerageTable(m1Context);
SList sl=new StockList(m1Context);
db.execSQL(st.stocktable);
db.execSQL(bt.Brokerage);
db.execSQL(sl.Create());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
複数のクラスでシングルトンインスタンスを使用すると、同じクラスのメソッド内ではなくクラス内で宣言されている場合にのみ、データベースがロックされているというエラーが発生します。以下のコード行では、astrik 間のコード行はクラス内のエラーを引き起こしているものであり、プラス記号間のコード行はエラーを発生させていませんが、両方のケースで同じプロセスを実行しています。
public class SList {
Context c1;
Cursor getid;
StockList(Context mContext){
c1=mContext;
}
**//SQLiteDatabase sd=Database.getInstance(c1).getWritableDatabase();**
String Ctable;
//String ,selectIDgetstocks,deletestock;
public String tablename="Stocklist";
public String Column1="_id";
public String Column2="Sname";
ContentValues cv=new ContentValues();
String getstocks="Select " + Column1 + " as _id, " + Column2 + " From "+ tablename;
String selectID="Select Max("+ Column1 + ") from " + tablename;
public String Create(){
Ctable="Create Table " + tablename + " (" + Column1 + " INTEGER PRIMARY KEY , " + Column2 + " Text" + ")";
return Ctable;
}
public void insert(int stockid,String name){
cv.put(Column1, stockid);
cv.put(Column2, name);
++Database.getInstance(c1).getWritableDatabase().insert(tablename,null,cv);++
}
}
誰でも私の混乱を解消してください。また、可能であれば、シングルトン使用の機能を教えてください。私の考えは、クラスの開始時にデータベース変数で sigleton インスタンスを使用し、クラス全体で必要な場所でその変数を使用することですが、それは可能ではありません。理由はわかりませんが、すべての場所で同じインスタンスを使用するとその後、エラーはありません。
理解するのを手伝ってください。