12

AndroidプロジェクトでORMLiteを使用していますが、AsyncTaskのデータベースに値を挿入しているため、拡張アクティビティを使用したくありません。

ドキュメントでは、次のように述べています。

「およびその他の基本クラスを拡張したくない場合はOrmLiteBaseActivity、それらの機能を複製する必要がありOpenHelperManager.getHelper(Context context, Class openHelperClass)ます。コードの先頭で呼び出し、ヘルパーを保存して必要なだけ使用してから、次のOpenHelperManager.release()ときに呼び出す必要があります。あなたはそれで終わりです。」

また、私が持っているデータベースヘルパークラスをに追加するように指示されてstrings.xmlいます。だから私は何が間違っているのかわかりません。

DataAccess次のようなデータ層に呼び出されるクラスを使用しています。

public class DataAccess {
    private Context context;
    private DBHelper dbHelper;

    public DataAccess(Context _context) {
        this.context = _context;
        dbHelper = getDBHelper(_context);
    }

    private DBHelper getDBHelper(Context context) {
        if (dbHelper == null) {
            dbHelper = (DBHelper) OpenHelperManager.getHelper(context, DBHelper.class);
        }
        return dbHelper;
    }
}

そして、私は拡張ヘルパークラスを使用しています:

public class DBHelper extends OrmLiteSqliteOpenHelper {
    private static final String DATABASE_NAME = "database.db";
    private static final int DATABASE_VERSION = 1;

    private Dao<SomeObject, Integer> someObjectTable = null;
    private ConnectionSource connectionSource = null;

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
        this.connectionSource = connectionSource;
        try {
            TableUtils.createTable(connectionSource, SomeObject.class);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

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

    public Dao<SomeObject, Integer> getSomeObjectDao() throws SQLException {
        if (someObjectTable == null) {
            dateTable = getDao(SomeObject.class);
        }
        return someObjectTable;
    }

アイデアは、DataAccessクラスを作成し、まだ作成しDBHelperていない場合は作成させることです。

誰かがこれが正しいか間違っているか、または私が正しい道を進んでいるかどうかを教えてもらえますか?

ありがとう!

4

2 に答える 2

15

Android プロジェクトで ORMLite を使用していますが、AsyncTask でデータベースに値を挿入しているため、拡張アクティビティを使用したくありません。

あなたは正しい軌道に乗っていますが、@Mattから少し外れています。率直に言って、基本クラスを拡張せずにプロジェクトを行ったことはありません。しかし、これは良い練習になるので、独自のヘルパーを使用して管理するこのORMLite サンプル プロジェクトを作成しました。Activity

あなたのDBHelperクラスは問題ありませんが、本当にあなたのクラスは必要ありませんDataAccess。各アクティビティ (またはサービス...) には、次のようなものが必要です。

private DBHelper dbHelper = null;

@Override
protected void onDestroy() {
    super.onDestroy();
    if (dbHelper != null) {
        OpenHelperManager.releaseHelper();
        dbHelper = null;
    }
}

private DBHelper getHelper() {
    if (dbHelper == null) {
        dbHelper = (DBHelper)OpenHelperManager.getHelper(this, DBHelper.class);
    }
    return dbHelper;
}

[明らかに]、次のようにしてコードでこれを使用します。

Dao<SomeObject, Integer> someObjectDao = getHelper().getSomeObjectDao();

したがってgetHelper()、最初に呼び出すときはいつでも、マネージャーを介してヘルパーを取得し、データベースへの接続を確立します。アプリケーションが OS によって破棄されるたびに、ヘルパーが解放されます。これが最後のリリースである場合は、基礎となるデータベース接続が閉じられる可能性があります。

基本クラスなしでこれを行う場合は、最初の引数として がOpenHelperManager.getHelper()必要であることに注意してください。ContextActivity

編集:

DataAccess型クラスを作成してヘルパー クラスの処理を一元化する場合は、メソッドを静的にし、独自の使用カウンターを作成する必要があります。複数のアクティビティとバックグラウンド タスクの呼び出しgetHelper()がある場合、問題はいつ呼び出すreleaseHelper()かです。カウンターが 0 に戻ったら、get と only の呼び出しリリースごとにカウントをインクリメントする必要があります。

于 2011-10-05T14:02:59.603 に答える
2

私はつまらないかもしれませんが、本質的にあなたはそれを正しくやっています。

呼び出し

dbHelper = (DBHelper) OpenHelperManager.getHelper(context, DBHelper.class);

DBHelperクラスを検索し、コンテキスト用にインスタンス化します。string.xml で定義した場合は、最後に DBHelper.class を省略できます。

onUpgradeyouDBHelper.javaでは、作成したテーブルを削除してonCreateから呼び出すことを検討onCreateすることをお勧めします (更新から更新への変換の問題がないことを確認するため)。必要に応じて、より複雑な更新を行うことができます。

それ以外は、良さそうです。基本の DAO メソッドを超える DB オブジェクトのデータ アクセサリ メソッドが必要になった場合、最終的にはオブジェクト DAO のより完全な実装を作成する必要がありますが、これは良い出発点です。

于 2011-10-05T05:11:31.140 に答える