1

私のアプリケーションには、カスタムContentProviderを介してアクセスするデータベースがあり、次の列があります。

  • id_widget = 値を表示したいウィジェットの appWidgetId
  • id_item = SQL JOIN クエリで取得する別のテーブルの値の ID
  • name_item = 作成したウィジェット構成アクティビティを通じて私が割り当てたアイテムの名前。

テーブルの例は次のようになります。

id_widget | id_item | name­_item
----------+---------+----------
    54    |    1    | avaible
    54    |    2    |  used
    58    |    1    |  left
    58    |    3    | avaible2
    58    |    5    |   old

私のウィジェットは保存されている最初の値だけを表示する必要がありますが、押されたときに次の値を表示し、最後の値まで表示してから、再び最初に移動する必要があります。したがって、たとえば、appWidgetId = 58 を持つウィジェットは、「左」を表示する必要があります (および SQL JOIN QUERY を使用して別のテーブルから取得する別の値。これらの値は、IntentService を介してサイトから解析され、別の場所に保存されます)。テーブル)。タッチすると値「avaible2」が表示され、次にもう一度タッチすると「old」が表示され、もう一度押すと最初の値「left」に移動するはずです。

私が思いついた最初のアイデアは、すべての値を取得するためにデータベースにクエリを実行し、それらを onUpdate メソッドで使用するために、AppWidgetProvider 内のいくつかのコレクションに格納することでした。そうすれば、ウィジェットに触れるたびにデータベースにクエリを実行する必要がなくなります。それは、私が AppWidgetProvider のドキュメントを読んで、それが実際にどのように機能するか、そして常に同じインスタンスを持っているとは限らないという事実を知るまででした。

別の解決策を 2 日間探しましたが、まだ何も見つかりません。私が持っている唯一のアイデアは次のとおりです: - 表示しているテーブルの行を追跡します (おそらくテーブルに別の列を追加することによって) - ウィジェットに触れるたびにデータベースに次の行を照会します。

それは十分に効率的ですか?私の問題を解決する他の方法はありますか?

私の英語で申し訳ありませんが、これは私の母国語ではないので、これが私にできる最善のことです。前もって感謝します

4

1 に答える 1

0

まず、あなたの英語は素晴らしいです!言及しなければ、それがあなたの母国語ではないことさえ知らなかったでしょう。:)

質問ですでに指摘したように、AppWidgetProviderはステートレスです。 AppWidgetProvider クラスの同じインスタンスを取得することは保証されていません (実際、そうである可能性は低いです)。これらは特別なタイプのBroadcastReceiverであり、リッスンしているイベントを処理するために必要な期間だけ存在します。特に、このセクションを参照してください。

ウィジェットの状態/データを維持する唯一の方法は、必要な情報を永続的に保存することです。Android では、ファイル、データベース、またはアプリのSharedPreferences (最終的にはファイルにもなります) に書き込むことを意味します。したがって、いくつかのオプションがありますが、データベース/ContentProvider が既にセットアップされていることを考えると、あなたが言及したように、単に別の列を追加することはおそらく理にかなっています。最終的には、どこかに保存する必要があるため、一般的にはファイル/データベースの読み取り/書き込みの数を最小限に抑える方が良いですが、この場合はそうする必要があります。特にデータベース クエリの実行に時間がかかっている場合は、クエリが完了するまでウィジェットにProgressBarを表示し、更新された情報を表示することができます。

完全を期すために、一部のウィジェットはバックグラウンドサービスを使用して、ウィジェットの状態を維持および/または更新します。ただし、これだけでは、デバイスの電源がオフになっている場合、または何らかの理由でサービスが停止した場合に、ウィジェットの状態/データが保持されないことは明らかです。これはあなたの状況ではうまくいかないと思います。

つまり、ウィジェットに関する私の知識に基づいて、あなたが提案したアプローチに同意します!

これは、データの処理に関するご質問とは直接関係ありませんが、Commonsware のこのサンプル アプリは、ウィジェットのクリックを処理するのに非常に役立ちました。

于 2013-09-27T14:09:19.963 に答える