【问题标题】:Singleton vs a static inner class for Database Helper class in Android单例与 Android 中 Database Helper 类的静态内部类
【发布时间】:2013-02-28 01:53:39
【问题描述】:

我正在尝试看看哪些实现更适合在 Android 应用程序中访问 sqlite 数据库

实施 1

使用扩展 SqliteOpenHelper 的 DatabaseHelper 类并使用单例模式。在极少数情况下,我确实会因为数据库关闭而看到崩溃。虽然有点烦人,但我让他们通过只是因为它在宏伟的计划和我拥有的项目数量上是次要的。

public class DBHelper extends SQLiteOpenHelper {

        private static DBHelper instance;

        private final String CREATE_HEALTH_DATA_TABLE = "CREATE TABLE IF NOT EXISTS my_table ( " 
        + BaseColumns._ID   + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
        + MT_FIELD_NAME     + " TEXT NOT NULL );";

        private DBHelper getInstance(Context c) {
             if (instance == null) {
                  instance = new DBHelper(c);
             }
             return instance;
        }

        private DBHelper(Context c) {
             super(c, "my_database.sqlite", null, 0);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}

    }

实施 2

实现这一点的另一种方法是在 Content Provider 类中创建帮助类作为静态内部类。这就是示例中记事本示例中的完成方式。

public class DataProvider extends ContentProvider {

    /*..Content provider implementation only dbhelper variable and onCreate are shown */

    private MTDBHelper dbHelper;

    @Override
    public boolean onCreate() {
         dbHelper = new DBHelper(getContext());
         return true;
    }

    private static class DBHelper extends SqliteOpenHelper {

    /// Implementation without making it a singleton

    }

}

其中哪些是更好或标准的处理方式以及原因。我猜这是第二种方法,因为它是一个内部私有类,但希望获得专家意见。

如果这很重要,我总是使用内容提供程序。

谢谢

【问题讨论】:

  • 我知道静态内部类的行为方式。我正在寻找一个特定于 Android 实现的答案,它可以帮助我了解在打开/访问/关闭数据库和线程方面的优点/缺点。

标签: android android-contentprovider android-sqlite


【解决方案1】:

我也不会。我有一个扩展SqliteOpenHelper 的非静态类。每当我需要数据库时,我都会通过创建一个新的DBHelper 实例来打开它,对它做我需要做的事情,然后立即关闭它,稍后仅在我需要它时重新打开它。这种实现可能会遇到两段代码尝试同时修改数据库的情况。为避免这种情况,请将每个方法包装在同步块中。我对这种方法没有任何问题。

【讨论】:

  • 是的,这肯定是另一种方式,但我必须处处处理线程同步。或许有人可以将这种方法与前两种方法一起权衡。但是现在我只对前两个中的一个感兴趣,因为我不想在我的代码中处理同步问题。不过谢谢。
  • @achie 我的最后两句话解决了这个问题。如果您将所有方法包装在 DBHelper 类中,那么您将不会在类之外遇到同步问题。
  • 坏主意......如果你有 2 个 Fragment 会发生什么......一个是 ListFragment 使用 CursorAdapter(所以你不能关闭 Helper,因为它也会关闭 Cursor),第二个 Fragmet 需要创建新的外汇助手。保存日期...
  • @Selvin 由于同步,这没有问题。您没有必须关闭帮助程序。
  • 您确定我们可以打开同一个 DbHelpers 的多个实例吗?我不这么认为......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多