Dokumentasi Android SDK mengatakan bahwa startManagingCursor()
metode tersebut dihentikan:
Metode ini tidak digunakan lagi. Gunakan kelas CursorLoader baru dengan LoaderManager sebagai gantinya; ini juga tersedia di platform lama melalui paket kompatibilitas Android. Metode ini memungkinkan aktivitas untuk mengurus pengelolaan siklus hidup Cursor yang diberikan untuk Anda berdasarkan siklus proses aktivitas. Artinya, saat aktivitas dihentikan, secara otomatis akan memanggil deactivate () pada Cursor yang diberikan, dan saat aktivitas itu dimulai ulang, ia akan memanggil requery () untuk Anda. Saat aktivitas dimusnahkan, semua Cursor yang dikelola akan ditutup secara otomatis. Jika Anda menargetkan HONEYCOMB atau yang lebih baru, pertimbangkan untuk menggunakan LoaderManager sebagai gantinya, tersedia melalui getLoaderManager ()
Jadi saya ingin menggunakan CursorLoader
. Tapi bagaimana saya bisa menggunakannya dengan custom CursorAdapter
dan tanpa ContentProvider
, ketika saya membutuhkan URI dalam konstruktor CursorLoader
?
Jawaban:
Saya menulis CursorLoader sederhana yang tidak membutuhkan penyedia konten:
Itu hanya membutuhkan
AsyncTaskLoader
kelas. Baik yang menggunakan Android 3.0 atau lebih tinggi, atau yang dilengkapi dengan paket kompatibilitas.Saya juga menulis
ListLoader
yang kompatibel denganLoadManager
dan digunakan untuk mengambiljava.util.List
koleksi generik .sumber
Tulis loader Anda sendiri yang menggunakan kelas database Anda, bukan penyedia konten. Cara termudah adalah dengan mengambil sumber
CursorLoader
kelas dari pustaka kompatibilitas, dan mengganti kueri penyedia dengan kueri ke kelas helper db Anda sendiri.sumber
CursorLoader
descendat untuk mengelola kursor SQLite, selain dari konstruktor, saya hanya perlu menggantiloadInBackground
metode untuk mengganti kueri penyedia dengan kueri kursor sayaSimpleCursorLoader adalah solusi sederhana, namun tidak mendukung pembaruan loader saat datanya berubah. CommonsWare memiliki pustaka loaderex yang menambahkan SQLiteCursorLoader dan mendukung kueri ulang pada perubahan data.
https://github.com/commonsguy/cwac-loaderex
sumber
Opsi ketiga adalah dengan mengganti
loadInBackground
:Ini juga akan menangani kueri ulang kursor Anda saat database berubah.
Satu-satunya peringatan: Anda harus menentukan pengamat lain, karena Google dengan kebijaksanaannya yang tak terbatas memutuskan untuk menjadikan paket mereka pribadi. Jika Anda memasukkan kelas ke dalam paket yang sama dengan yang asli (atau yang compat), Anda sebenarnya dapat menggunakan pengamat asli. Pengamat adalah objek yang sangat ringan dan tidak digunakan di tempat lain, jadi ini tidak membuat banyak perbedaan.
sumber
loadInBackground()
, sebelum mengembalikan kursor, katakancursor.setNotificationUri(getContext().getContentResolver(), uri);
uri mungkin hanya dari String acak sepertiUri.parse("content://query_slot1")
. Sepertinya tidak peduli uri benar-benar ada atau tidak. Dan setelah saya melakukan operasi pada DB. KatakangetContentResolver().notifyChange(uri, null);
akan melakukan triknya. Kemudian saya dapat membuat beberapa "kueri uri slot" di file contant untuk aplikasi dengan sejumlah kecil kueri. Saya menguji memasukkan catatan DB dalam runtime dan tampaknya berfungsi tetapi saya masih ragu itu adalah praktik yang baik. Ada saran?Pilihan ketiga yang diajukan oleh Timo Ohr, bersama dengan komentar Yeung, memberikan jawaban paling sederhana (Occam's razor). Di bawah ini adalah contoh kelas lengkap yang cocok untuk saya. Ada dua aturan untuk menggunakan kelas ini.
Setiap kali database yang mendasarinya berubah (misalnya, setelah menyisipkan atau menghapus), pastikan untuk memanggil
di mana myUri sama dengan yang dikembalikan dari implementasi metode getContentUri ().
Berikut kode kelas yang saya gunakan:
sumber