【问题标题】:correct use of SQLiteOpenHelper (and some consultation)正确使用 SQLiteOpenHelper(和一些咨询)
【发布时间】:2013-07-18 19:59:27
【问题描述】:

我有下面的代码。

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

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

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();
}

【问题讨论】:

    标签: android sql database sqlite android-sqlite


    【解决方案1】:

    第一季度

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

    关于调用db.close(),如果是在onDestroy()里面就可以了。

    第二季度

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

    第三季度

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

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

    【讨论】:

      【解决方案2】:

      第 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 上下文;))

      【讨论】:

        【解决方案3】:

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

        whenever i want to use database i do it like this
        mainclass mc=new mainclass(this);
        mc.open();
        mc.insert();
        mc.close();
        

        【讨论】:

        • 你每次都打开和关闭吗?当你有多线程时会发生什么?
        • 是的,但是我认为对于这种情况,如果您使用内容提供程序,然后使用光标加载程序,您将获得最好的结果.
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-28
        相关资源
        最近更新 更多