通过创建对象或使用getwritabledatabase打开数据库连接

时间:2014-03-24 11:13:20

标签: android android-sqlite

我的应用程序有7个活动,所有活动都高度依赖于数据库,访问时每个活动都会查询数据库。

对于这个问题,我为数据库类和我在下面声明的每个操作创建了一个单例数据库对象。

Database.getInstance(c1).getWritableDatabase()

用于插入,选择和删除我正在使用如下

-- insert Database.getInstance(c1).getWritableDatabase().insert
-- select Database.getInstance(c1).getWritableDatabase().rawquery
-- delete Database.getInstance(c1).getWritableDatabase().rawquery

我正在使用这种方式,因为在整个应用程序中只使用了一个对象,并且不会创建多个对象。

但谷歌搜索时我研究了 getWritableDatabase()将打开与数据库的连接,现在我很困惑对象是数据库类是打开连接还是调用 getwritabledatabase 打开一个连接。

我很担心,因为我觉得我在不知不觉中创造了很多联系。

编辑---------------------------------------------- -----------------------------

我试图在每个活动中创建一个可写数据库对象,并在该actovity中使用该对象,但它返回了数据库锁定异常,因此我被迫使用 Database.getInstance(c1).getWritableDatabase( )用于每个数据库操作

我创建如下

Sqldatabase sd=Database.getInstance(c1).getWritableDatabase()

任何人都可以请教我如何打开数据库以及应该关闭哪里以使应用程序稳定并避免内存泄漏。我是android的新手,请让我知道我的设计使用是否有效。

感谢您的时间。

编辑---------------------------------------------- ----------------------------------- 数据库文件

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

        }


    }

类文件:

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);++

    }


}

2 个答案:

答案 0 :(得分:2)

您应该具有打开数据库的功能,关闭数据库的功能以及其他要查询的功能。考虑以下课程:

public void openDatabase(){
database = Database.getInstance(c1).getWritableDatabase();
}

public void closeDatabase(){
database.close()
}

public void insert(){
//your insertion code here using database object
}

public String select(){
//your selection code here using database object
}

制作数据库类变量。通过这种方式,您可以先调用openDatabase(),然后再次打开,直到您关闭它或第一次实例化该类。

然后您可以根据需要使用插入或选择。

希望这有帮助

答案 1 :(得分:1)

我认为课程DatabaseSQLiteOpenHelper的包装,对吧?由于您有一个单身人士,因此每次拨打getWritableDatabase()时都会使用现有连接。仅在第一次调用时才调用新连接。您可以在onResumeonCreate打开新连接,然后在onDestroyonPause关闭它。

来自getWritableDatabase()上的文档:

成功打开后,数据库将被缓存,因此每次需要写入数据库时​​都可以调用此方法