Singleton与Android中的Database Helper类的静态内部类

时间:2013-02-28 01:53:39

标签: android android-contentprovider android-sqlite

我试图了解哪些实现更适合在Android应用程序中访问sqlite数据库

实施1

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

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

    }

}

其中哪一种更好或更标准的方式和原因。我猜这是第二种方法,因为它是一个内部私人课程,但我想有专家意见。

如果重要的话,我总是使用内容提供商。

谢谢

1 个答案:

答案 0 :(得分:1)

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