2

現時点では、テーブルの一番上の行を見つけるクエリがあります。このクエリは、OnCreateLoader メソッドでローダーを使用して呼び出されます。

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // TODO Auto-generated method stub

    int age = args.getInt("age");
    int yearDay = args.getInt("year");

    String sort = "(CASE WHEN DateSeen IS NULL "
            + "THEN 1 ELSE 0 END) DESC," + "DateSeen DESC," + "Abs((" + age
            + "  * 365) - (Age * 365) + (" + yearDay
            + " - (Case When YearDay is null then " + yearDay
            + "- 50 ELSE Yearday END)))";

    String[] projection = new String[] { DatabaseProvider.KEY_DESCRIPTION,
            DatabaseProvider.KEY_INT_AGE, DatabaseProvider.KEY_INT_YEARDAY,
            DatabaseProvider.KEY_ID };

    return new CursorLoader(this, DatabaseProvider.CONTENT_URI, projection,
            null, null, sort);

}

onLoadFinished メソッドでは、結果を画面にレンダリングしますが、行の DateSeen 列も更新します (更新してもこの行が再び表示されないようにするため)。

    @Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor c) {

    // lots of code to display results in UI

    // update SeenDate
    c.moveToFirst();

    String Id = c.getString(c.getColumnIndex(DatabaseProvider.KEY_ID));
    ContentResolverCaller.UpdateDateSeen(Id);
}

私の問題 (少なくとも私は推測しています) は、結果の DateSeen 列が更新されたときです。これは、データが変更された場合にローダーが自動更新するコンテンツ オブザーバーを持っているためです。無限ループに。

私の質問は、ローダーの自動更新機能をオフにすることは可能ですか? ローダーをトリガーしてクエリを再度実行せずに、DateSeen 列を更新するにはどうすればよいですか?

編集: 問題が発生した場合に備えて、UpdateDateSeen メソッドを含めるのを忘れていました。それは以下のとおりです (私はすべての ContentResolver 呼び出しを保存するクラスを持っていますが、それが最善の解決策であるかどうかはわかりません - きちんとしているだけです)

    public static int UpdateDateSeen(String Id) {
    ContentValues cv = new ContentValues();
    cv.put(DatabaseProvider.KEY_DATESEEN, new Date().getTime());

    return context.getContentResolver().update(
            Uri.withAppendedPath(DatabaseProvider.CONTENT_URI, Id), cv,
            null, null);
}
4

1 に答える 1

1

データベースヘルパークラスでsetNotificationUriを呼び出して、dbの変更を監視していると思います。電話してはいけない

getContentResolver().notifyChange(uri, null);

更新クエリで。これにより、コンテンツ リゾルバーが再度クエリを更新することはありません。

于 2013-05-30T13:43:43.583 に答える