0

当我在类中使用单例数据库对象时遇到问题,我得到数据库锁定异常,但是当我在同一个类的任何方法中使用相同时,一切都很好,我对行为感到困惑。下面是代码: 数据库类:具有单例功能

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 实例,并在整个类中需要的地方使用该变量,但这是不可能的,不知道为什么,但是当我在所有地方使用相同的实例时然后没有错误。

请帮我理解。

4

1 回答 1

0

如果您使用数据库,请使用此。

String query = "select * from table1";
synchronized(Database.getInstance(c1) )
        {
           db = Database.getInstance(c1).getWritableDatabase();
           Cursor c = db.rawQuery( query );
           c.moveToFirst();
           do
           {
                // do someting use database.
                Log.d( SList.class.getName(), c.getString( 0 ) );
           }while( c.moveToNext() );
           c.close();
           db.close();
        }
于 2014-03-24T05:44:15.060 回答