I know this has been discussed yet I wanted to ask about the current state of the matter. Do i have to create a ContentProvider to use CursorLoader in connection with a sqlite database?
I found
CursorLoader usage without ContentProvider
Looks exactly what I was hoping for yet as Emmby commented
So another solution is mentioned
https://github.com/commonsguy/cwac-loaderex
yet again some drawback is pointed out
Of course when using LoaderManager we want to get all the benefits for which it was introduced. So my question is if there is a way to use LoaderManager in connection with a sqlite database without having to implement a content provider yet have all the benefits of it.
Thanks
This class was deprecated in API level 28.
A CursorLoader is a specialized member of Android's loader framework specifically designed to handle cursors. In a typical implementation, a CursorLoader uses a ContentProvider to run a query against a database, then returns the cursor produced from the ContentProvider back to an activity or fragment.
What is the Content Resolver? The Content Resolver is the single, global instance in your application that provides access to your (and other applications') content providers.
notifyChange(insertedId, null);
The two implementations you mention in your post both offer all of the benefits of the CursorLoader
except the ability to receive notifications when the underlying content changes.
I've been looking into this a lot recently and I can confidently tell you that the Android API currently does not provide a means of doing this with only a raw SQLiteDatabase
(it only provides the ContentResolver#notifyChange()
and Cursor#setNotificationUri()
methods, which are used to notify all Cursor
s registered under a certain notification Uri
).
That said, your options right now are to:
Implement an observer yourself that is capable of receiving notifications from the SQLiteDatabase
when the content changes, and is somehow able to relay these notifications to all existing Loader
s in your application. I wrote a pretty extensive blog post on how to implement Loader
s that might come in handy if you wish to take on this challenge. Or...
Use Mark Murphy's LoaderEx
library and only make database modifications using the AsyncTask
operations his library provides. Note that the reason why his tasks refresh the Loader
is because they call onContentChanged
on the Loader
immediately after the insertion/update/delete is performed, effectively telling the Loader
that the content has changed and that it should refresh its data.
Just use a ContentProvider
with a CursorLoader
and you can use the ContentResolver#notifyChange()
method to notify the CursorLoader
that a content change has occurred.
I'm trying to figure out a better solution, and I'll report back in the future if I ever find/implement one, but for now these will have to do.
Here is my solution, in my onCreateLoader
{ Uri u = Uri.parse("content://what_string_you_want"); return new CursorLoader(this, yourURI, projection, null, null, null) { private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver(); @Override public Cursor loadInBackground() { Cursor c = YOUR_DATABASE.doYourQuery(...); if (c != null) { // Ensure the cursor window is filled c.getCount(); c.registerContentObserver(mObserver); } c.setNotificationUri(getContext().getContentResolver(), getUri()); return c; } }; }
After the code that will change DB, add
getContentResolver().notifyChange( Uri.parse("content://same_with_first_string"), null);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With