Cursorの更新について

1,130 views
Skip to first unread message

mako

unread,
Feb 25, 2012, 12:21:02 AM2/25/12
to 日本Androidの会
makoといいます。よろしくお願いします。

現在SQLiteデータベースを使用したアプリケーションの作成をしています。以下のようにして

SQLiteのクエリを実行しIntent、SimpleCursorAdapterクラスを継承したクラスによってレコードをリスト表示していま
す。
リストビューのアイテムをクリックすることによりpositionを取得してIntent、レコードの詳細表示をしております。
そこで、レコードの詳細表示Activityにおいてレコードのupdateを実行しています。
そのupdateを反映させるにはもう一度上記のクエリ実行を行わなくてはならないのでしょうか。
レコードの詳細表示でpositionを変更、さらにposition変更でupdateしたレコード戻ってきた状態ではupdateが反映されないの
で、どのようにすべきか考えていますが思いつかず困っています。
他のアプリなどを見たらリスト表示においてもupdateが反映されていたりするので、私の知らない手法がこのような場合にあるのではないかと思ってお
ります。
どなたか御教授いただけますでしょうか。

松村

unread,
Feb 25, 2012, 1:07:11 AM2/25/12
to 日本Androidの会
松村と申します。

ContentObserverというクラスがあり、
これを使用すればDBの監視が可能です。
DBの変更を検知した時に呼ばれるコールバックを契機に、
UI更新処理を走らせる方法はいかがでしょうか?
http://developer.android.com/reference/android/database/ContentObserver.html

以上です。

mako

unread,
Feb 25, 2012, 1:36:16 AM2/25/12
to 日本Androidの会

Naoyuki Miyata

unread,
Feb 25, 2012, 5:09:41 AM2/25/12
to android-g...@googlegroups.com

宮田です。

よく意味がわからないので、
一点だけ確認させて下さい。

「リストビューの再表示を行いたい」
と言うことでしょうか?

2012/02/25 15:36 "mako" <mako.du...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

mako

unread,
Feb 25, 2012, 8:06:15 AM2/25/12
to 日本Androidの会
>松村さん

返信ありがとうございます。
ContentObserverクラスによって
UI更新を走らせるとしても、やはりSQliteのクエリを再度実行して
UIの更新をしなくてはならないのでしょうか。
Cursorオブジェクトを再取得しないかぎり
update内容が反映されるようには出来ないのかと考えていまして、、



On 2月25日, 午後3:07, 松村 <define1...@gmail.com> wrote:
> 松村と申します。
>
> ContentObserverというクラスがあり、
> これを使用すればDBの監視が可能です。
> DBの変更を検知した時に呼ばれるコールバックを契機に、
> UI更新処理を走らせる方法はいかがでしょうか?http://developer.android.com/reference/android/database/ContentObserv...

mako

unread,
Feb 25, 2012, 8:17:58 AM2/25/12
to 日本Androidの会
>宮田さん

よくわからない文章で申し訳ありません。
リストビューの再表示も行いたいのですが、
お聞きしたいのはupdateによって更新したレコードの内容を反映させたいのですが、
Cursorオブジェクトを再度取得する以外に方法はないのかとお聞きしたいです。
現在はレコードにupdateした内容をレコードから取得したいのですが
その場合、update以前のデータが表示されてしまいます。
再度Cursorオブジェクトを取得した場合はupdate内容が反映されていますが
この処理をすべての挙動に何度も繰り返すのはどうなのかとおもいまして
他の方法を伺っています。よろしくお願いいたします。


On 2月25日, 午後7:09, Naoyuki Miyata <n.miyata080...@gmail.com> wrote:
> 宮田です。
>
> よく意味がわからないので、
> 一点だけ確認させて下さい。
>
> 「リストビューの再表示を行いたい」
> と言うことでしょうか?
> 2012/02/25 15:36 "mako" <mako.dulink....@gmail.com>:

松村

unread,
Feb 25, 2012, 10:10:46 AM2/25/12
to 日本Androidの会
To: mako様

松村です。

> UI更新を走らせるとしても、やはりSQliteのクエリを再度実行して
> UIの更新をしなくてはならないのでしょうか。
Cursorはクエリの結果セットへの参照です。
DB内容が更新されても、DB更新前に取得したCursorからDB変更後の値は取得できません。
mako様ご推察のとおり、再度クエリを発行して新しいCursorオブジェクトを取得する必要があります。

Cursorには、再度クエリ発行するrequery()というメソッドが存在しますが非推奨APIです。
http://developer.android.com/reference/android/database/Cursor.html#requery()
# Don't use this. Just request a new cursor, so you can do this
asynchronously and update your list view once the new cursor comes
back.
Cursorを使い回すよりは新しいCursorを取得しなおした方が良いでしょう。

常に(バックグラウンドでのDB更新も含め)最新のDB内容を表示する方法としては、
 DBを更新→ContentObserver.onChange→クエリ再発行でCursor取得→UI更新
といったところでしょうか?

DB監視するまでもない場合はAsyncTaskやCursorLoaderを使用して、
 DBを更新→クエリ再発行でCursor取得→UI更新
でもいけそうですね。

以上です。

mako

unread,
Feb 25, 2012, 11:01:13 AM2/25/12
to 日本Androidの会
>松村様

返信ありがとうございます
やはり再度クエリを発行するのですね。
ありがとうございました。

On 2月26日, 午前12:10, 松村 <define1...@gmail.com> wrote:
> To: mako様
>
> 松村です。
>
> > UI更新を走らせるとしても、やはりSQliteのクエリを再度実行して
> > UIの更新をしなくてはならないのでしょうか。
>
> Cursorはクエリの結果セットへの参照です。
> DB内容が更新されても、DB更新前に取得したCursorからDB変更後の値は取得できません。
> mako様ご推察のとおり、再度クエリを発行して新しいCursorオブジェクトを取得する必要があります。
>
> Cursorには、再度クエリ発行するrequery()というメソッドが存在しますが非推奨APIです。http://developer.android.com/reference/android/database/Cursor.html#r...()

mako

unread,
Feb 25, 2012, 9:00:15 PM2/25/12
to 日本Androidの会
皆さん、ありがとうございました。
クエリの再発行からUI更新すると、通常先頭のレコードが表示されてしまうのですが
getPosition()によってposotionを取得、
そのpositionに移動してレコードを再表示しようとしました。
しかし、クエリの再発行を行った場合、その後
getPosition()はリストビューActivityの末尾+1のpositionを取得してしまい、
クエリの再発行を行わない場合はきちんと
getPosition()は現在表示しているレコードのpositionを取得します。
クエリの再発行時にはなにかpositionを取得する方法があるのでしょうか?

たびたび申し訳ありませんが、よろしくお願いいたします。

mako

unread,
Feb 25, 2012, 9:27:09 PM2/25/12
to 日本Androidの会
すみません、自己解決しました。

kacodama

unread,
Feb 26, 2012, 8:56:56 PM2/26/12
to 日本Androidの会
もう解決されているようですが。

ご希望の動作では、Cursor#setNotificationUri(ContentResolver cr, Uri uri)と
ContentResolver#notifyChangeを利用するのが便利ではないでしょうか?
使い方などについては、検索すれば出てくるかと思います。

以上ご参考までに。
Reply all
Reply to author
Forward
0 new messages