0

我在下面有以下代码。

我正在我的应用程序中创建一个使用 SQLiteOpenHelper 的数据库。我有几个问题,希望能得到一些咨询。在堆栈溢出时没有找到这些的直接答案,因为它们可能是主观的。

1 - 我将在几个活动中使用这个数据库。但是,我不打算将其设为单例以避免泄漏,而是我将在每个方法中获取 getWritableDatabase() 和 getReadableDatabase()。我计划在每个活动的 onDestroy() 中做一个 db.close() 。这是可取的吗?鉴于我的应用程序有几个活动并且不是一个巨大的应用程序。

2 - 我没有遵循 DAO 模型,也没有为每个表使用不同的类。在我看来,我不需要。我吗?

3 - (一个问题而不是咨询)在下面的代码中,我没有创建表单的数据库

    private SQLiteDatabase database;

因此,对数据库的所有引用(来自我的活动)都是通过同一子类 SQLiteOpenHelper 中的方法完成的,因此我直接通过 getWritableDatabase 和 getReadableDatabase 引用物理创建的数据库。我需要创建一个 SQLiteDatabase 实例并使用它吗?甚至在 SQLiteOpenHelper 的子类中?

下面是代码。

public class DbHelper extends SQLiteOpenHelper 
{
private static final String DATABASE_NAME = "myDbName";
private static final String DATABASE_TABLE = "myTable";
private static final int DATABASE_VERSION = 1;
private Context ctx;

public DbHelper(Context context)
{
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.ctx = context;

}

@Override
public void onCreate(SQLiteDatabase db)
{
    db.execSQL("CREATE TABLE myTable(_id INTEGER PRIMARY KEY, title TEXT);");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
    //nothing here now. maybe later.
}

public void insertTitle(String title)
{
    ContentValues titleCV = new ContentValues();
    titleCV .put("title", title);

        getWritableDatabase().insert(DATABASE_TABLE, null, titleCV );
}

public void getTitles()
{
    Cursor result = getReadableDatabase().rawQuery("SELECT _id, title FROM myTable", null);

    while (result.moveToNext())
    {
        int id = result.getInt(0);
        String titleGotten= result.getString(1);
    }

    result.close();
}
4

3 回答 3

2

第一季度

如果您的应用程序中有两个并行线程访问数据库的场景,请使用单个实例SQLiteOpenHelper(单例或成员中的Application或其他)。如果不是,你不需要。

关于调用db.close(),如果它在onDestroy(),那很好。

第二季度

DAO 是一个抽象层,用于简化项目的维护和扩展。如果您不打算扩展或维护您的代码(即将发布的版本或其他内容),那么我想您不需要一个。

第三季度

您不需要创建SQLiteDatabse. 当你调用getReadableDatabase()or时getWritableDatabase()SQLiteOpenHelper创建并维护一个实例。下次调用时使用相同的实例getReadable\WritableDatabase()

如果您还有问题,请告诉我。

于 2013-07-19T14:50:58.157 回答
0

第 1 步:制作 SqliteOpenHelper 的静态实例 第 2 步:您永远不会关闭数据库,sqlite 管理自己的顺序访问以写入或读取 :)

private static ControladorBBDD instancia;

我的课:public class ControladorBBDD extends SQLiteOpenHelper {

默认 :

private ControladorBBDD(Context ctx_p) throws Exception {   
super(ctx_p, DB_NAME, null, DATABASE_VERSION);
        try {
            ControladorBBDD.ctx = ctx_p;
            DB_PATH = ctx.getDatabasePath(DB_NAME).getAbsolutePath();
            String myPath = DB_PATH;// + DB_NAME;
            this.createDataBase();

            db = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READWRITE);

        } catch (SQLiteException ex) {
            Conexiones.escribirLog(Log.getStackTraceString(ex),
                    ctx.getString(R.string.versionReal));
            db.close();
        }
    }

以及我实现数据库连接的方法:

public static synchronized ControladorBBDD getBBDD(Context ctx_p)
            throws Exception {
        if (instancia == null) {
            instancia = new ControladorBBDD(ctx_p);
        }
        return instancia;
    }

并从活动中调用它:

dblectura = ControladorBBDD.getBBDD(getApplicationContext()); 在哪里private ControladorBBDD dblectura;

我希望它有所帮助,重要的是您使用 applicationContext,没有 Activity 上下文;))

于 2013-07-22T15:23:49.867 回答
-2

好吧,如果我是 ui 将创建一个类并将 dbhelper 作为子类,那么我将对主类和插入使用打开和关闭函数

whenever i want to use database i do it like this
mainclass mc=new mainclass(this);
mc.open();
mc.insert();
mc.close();
于 2013-07-18T20:36:40.673 回答