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

これを実装するもう 1 つの方法は、ヘルパー クラスを 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

    }

}

これらのうちどれが物事のより良いまたは標準的な方法であり、その理由. これは内部のプライベート クラスであるため、2 番目のアプローチであると推測していますが、専門家の意見が必要です。

それが問題になる場合は、常にコンテンツ プロバイダーを使用しています。

ありがとうございました

4

1 に答える 1

1

私はどちらもしません。を拡張する非静的クラスがありますSqliteOpenHelper。データベースが必要なときはいつでも、新しいDBHelperインスタンスを作成して開き、必要な処理を行ってすぐに閉じ、後で必要なときにのみ再度開きます。この実装では、コードの 2 つのセクションが同時にデータベースを変更しようとするケースに遭遇する可能性があります。これを避けるには、すべてのメソッドを同期ブロックでラップします。私はこのアプローチで何の問題もありませんでした。

于 2013-02-28T02:09:03.857 に答える