9

我正在尝试查看哪些实现更适合在 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

    }

}

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

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

谢谢

4

1 回答 1

1

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

于 2013-02-28T02:09:03.857 回答