1

我对 OOP 有点陌生,所以我想知道我是否正确地做事。为了与数据库通信,我创建了一个类 SQLiteHelper,女巫完成所有常见的事情(onCreate,onUpdate),还打开和关闭连接。

这是课程,目前它刚刚放在桌面上,但会添加更多内容:

public class SQLiteHelper extends SQLiteOpenHelper{
    public static final String DATABASE_NAME = "notebook";
    public static final int DATABASE_VERSION = 2;

    public static final String TABLE_LIST = "list";
    public static final String TABLE_LIST_ID = "_id";
    public static final String TABLE_LIST_NAME = "name";

    public SQLiteDatabase db;

    public SQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("create table " + TABLE_LIST + "(" + TABLE_LIST_ID
                + " integer primary key autoincrement, " + TABLE_LIST_NAME
                + " text not null);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LIST);
        onCreate(db);
    }

    public void open(){
        db = getWritableDatabase();
    }

    public void close(){
        db.close();
    }
}

接下来对于每个表,我将创建一个新类,它扩展了前一个类,并且我在其中执行与该特定表相关的所有操作。例如 ListSQL:

public class ListSQL extends SQLiteHelper {

    public ListSQL(Context context) {
        super(context);
    }

    public void delete(int id) {
        open();
        db.delete(TABLE_LIST, TABLE_LIST_ID + " = " + id, null);
        close();
    }

}

我的问题是,在 OOP 中这是正确的做事方式吗?特别是在 ListSQL 中使用 open/close 方法以及 db 和 TABLE 变量对我来说似乎有点奇怪?

4

3 回答 3

3

我总是在中打开数据库连接并在中onResume()关闭它onPause()。这样,数据库始终为每个活动打开。

我不这样做的原因onCreate()onDestroy()一旦用户转到其他活动onCreate()new activity将首先调用onDestroy()旧活动,所以如果我在其他地方执行任何操作(例如:- 在我的列表中搜索或更改用户的状态等)然后onCreate()它会合理地使应用程序崩溃database already closed

注意:您必须打开和关闭连接,即使您使用的是 SQLiteHelper 类。

于 2014-03-11T13:37:11.830 回答
0

根据 Android 手册,使用 SQLiteOpenHelper 时不需要关闭数据库。系统会为你做的。

于 2013-01-22T23:14:38.407 回答
-3

正如上面提到的@Dan,如果您使用的是SQLiteOpenHelper,则无需在每次执行读/写操作时打开和关闭数据库。使用数据库的最佳方法是:

1.

Application基类中声明并初始化SQLiteHelper的实例,如下所示:

public class App extends Application {
  public static SQLiteHelper db;

  @Override
  public void onCreate() {
    super.onCreate();
    db = new SQLiteHelper(getApplicationContext());
    db.open();

  }
}

2.

在您的活动中,或您想使用数据库的任何其他地方,初始化 SQLiteHelper 对象,如下所示:

SQLiteHelper db = App.db;

然后您可以随意使用数据库,而不必担心打开和关闭它(:

于 2014-03-11T05:51:43.077 回答