可以使用静态"数据库助手"类吗?

sve*_*ija 5 java sqlite android

我有一些Android项目,其中大部分都与SQLite数据库连接.我感兴趣的是使用一些静态类如" DatabaseHelper.class "这是一个很好的编程习惯(或者是一个糟糕的习惯),其中我将使用与数据库操作相关的所有静态方法.例如

public static int getId(Context context, String name) {
    dbInit(context);

    Cursor result = db.rawQuery("SELECT some_id FROM table WHERE some_name = '" + name + "'", null);
    result.moveToFirst();
    int id = result.getInt(result.getColumnIndex("some_id"));
    result.close();

    return id;
}
Run Code Online (Sandbox Code Playgroud)

其中dbInit(context) (在我的所有静态方法中用于数据库操作)

private static void dbInit(Context context) {
    if (db == null) {
        db = context.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,当我需要一些东西时,我可以轻松地调用这些方法

int id = DatabaseHelper.getId(this, "Abc");
Run Code Online (Sandbox Code Playgroud)

编辑:我是否必须在每个连接上使用dbClos​​e或者保持每个活动打开并关闭每个活动?那么我是否将上面的代码更改为这样的内容?

    ...
    dbClose();

    return id;
}

private static void dbClose() {
    if (db != null) {
        db.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*sen 6

我建议你养成每次需要时都能获得数据库连接的习惯,并在完成后将其释放回来.这种设施的通常名称是"数据库连接池".

这会将连接逻辑移出实际代码并进入池中,并允许您在以后需要时执行许多操作.一个简单的事情,可能是池记录了连接对象的使用时间,因此您可以获得有关数据库使用情况的信息.

如果您只需要一个连接,那么您的初始池可以非常简单.

  • 一个单独的sqlite连接是一个过度杀戮,因为那些只需0.2ms就可以打开,所以这样做但是跳过了游泳池 (3认同)

Rom*_*ain 5

我肯定会将你的数据库相关代码放在一个单独的类中,但是真的建议不要使用静态类或Singleton.它起初可能看起来很好,因为它很方便,但不幸的是它紧密地结合了你的类,隐藏了它们的依赖性,并且还使得单元测试变得更加困难.

维基百科中的缺点部分简要概述了您可能希望探索其他技术的原因.您还可以前往在这里在那里,他们给一个使用数据库访问单身一类的具体例子,以及如何使用依赖注入,而不是能解决一些我提到的问题.

作为第一步,我建议使用在构造函数中实例化的普通类,例如:

public class MyActivity extends Activity {    
  private DBAccess dbAccess;
  public MyActivity() {
     dbAccess = new DBAccess(this);
  }    
}
Run Code Online (Sandbox Code Playgroud)

作为第二步,您可能想要研究像RoboGuice这样的框架来打破硬依赖.您的代码看起来像:

public class MyActivity extends Activity {    
  @Inject private DBAccess dbAccess;
  public MyActivity() {
  }    
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多详情,请告诉我们!