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

Android 通过创建对象或使用getwritabledatabase打开数据库连接,android,android-sqlite,Android,Android Sqlite,我的应用程序有7个活动,它们都高度依赖于数据库,每个活动在被访问时都会大量查询数据库 对于这个问题,我为database类和我调用下面语句的每个操作创建了一个singleton数据库对象 Database.getInstance(c1).getWritableDatabase() 对于插入、选择和删除,我使用的方法如下 -- insert Database.getInstance(c1).getWritableDatabase().insert -- select Database.getIn

我的应用程序有7个活动,它们都高度依赖于数据库,每个活动在被访问时都会大量查询数据库

对于这个问题,我为database类和我调用下面语句的每个操作创建了一个singleton数据库对象

Database.getInstance(c1).getWritableDatabase()
对于插入、选择和删除,我使用的方法如下

-- insert Database.getInstance(c1).getWritableDatabase().insert
-- select Database.getInstance(c1).getWritableDatabase().rawquery
-- delete Database.getInstance(c1).getWritableDatabase().rawquery
我使用这种方式是因为通过这种方式,整个应用程序中只使用一个对象,而不会创建多个对象

但在搜索web时,我了解到getWritableDatabase()将打开到数据库的连接。现在我搞不清楚是数据库对象类会打开连接,还是调用getwritabledatabase会打开连接

我很担心,因为我觉得我在不知不觉中建立了太多的联系

编辑 我尝试在每个活动中创建一个可写数据库对象,如下所示,并在该活动中使用该对象,但它返回了数据库锁定异常,因此我被迫对每个db操作使用
数据库.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);++

    }


}

我相信class
Database
SQLiteOpenHelper
的包装器,对吗?因为您有一个单例,所以每次调用
getWritableDatabase()
时,它都在利用现有连接。新连接仅在第一次调用时被调用。例如,您可以在
onResume
onCreate
打开新连接,然后在
onestory
onPause
关闭它

getWritableDatabase()
上的文档:


一旦成功打开,数据库将被缓存,因此您可以在每次需要写入数据库时调用此方法

您应该具有打开数据库的函数、关闭数据库的函数和其他查询函数。考虑下面的类:

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()
,在第一次关闭它或实例化该类之前,不必再次打开它

然后可以根据需要使用“插入”或“选择”


希望这有帮助

谢谢@nikis的回复。。。但我的疑问就在这里,因为我无法为一个活动创建一个GetWritable数据库。。我被迫使用
数据库.getInstance(c1).getWritableDatabase()用于所有数据库操作。。我想知道这是否会创建n个连接。请帮助我understand@Siva不,不会的。你每次打电话都会使用相同的cahced连接这对我来说是一个很好的信息。。。还有一个问题,在这种情况下,我应该在哪里关闭连接?我计划在每次语句数据库操作后关闭。这是正确的方法吗?如果没有,请使用正确的方法进行指导。@Siva不是从多个线程使用DB的最佳方法,因此取决于应用程序的逻辑感谢@nikis的帮助谢谢@Sujan,但我这里的问题是我有7个活动,所有7个都需要开放的数据库连接,在这种情况下,当我7次使用opendatabase对象时,它给了我
数据库锁定
异常,因此我创建了singleton。我的疑问是,当我使用singleton实例时,我的连接被打开了,或者当我调用
getwritabledatabase
时,我的连接被打开了?根据文档,当getwritabledatabase()时被称为。如果最近未打开数据库,则将创建该数据库的新实例。如果数据库已经打开,当我们调用getWritableDatabase()时,它将尝试返回缓存的对象。因此,我认为该连接是重复使用的,而不是创建新的连接。谢谢@Sujan的回复