This question would be a follow up from the one asked Content Resolver vs Cursor Loader Where the answer clearly states how to insert records into a sqlite Db using a Content Resolver . My question is the following :
- Can i use a loader(Normal Loader) to implement this functionality ?
eg :
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
switch (id) {
case AppConstants.LOADER_ADD_FAV_PHONE_NUM:
ContentValues values = new ContentValues();
values.put(DBHelper.TM_DB_COLUMN_PHONE_NUMBER,
directionOrder);
values.put(TransitMeDBHelper.TM_DB_COLUMN_NAME_ID, selectionArgs[0]);
Uri insertFavStop =getContentResolver().insert(TransitMeContentProvider.CONTENT_URI_INSERT_FAV_PHONE,
values);
break;
}
return null;
}
Would this run the functionality in the Main UI thread or a worker Thread . I understand that i would not receive callbacks for this as the content resolver will return a URI instead of the cursor containing data .
I tried running this code but it behaves kind of wierd .. Duplicate inserts are recorded and its not consistient , Could someone show me to some right resource which uses a Loader to do Insert operations ( I have seen many examples with query examples and it works like a charm :) )
Thank you for your time .
You can't use a default
CursorLoader
to insert data. If you implement your ownLoader
you could probably use theloadInBackground
method to do the insert but that will make your code awkward at best(and I don't know if it will actually work).The loader callbacks will run on the thread where they are implemented(the UI main thread most likely) so you're doing the
getContentResolver().insert()
on the main UI thread with the possibility of blocking the main UI thread.Have you tested how many times is the
onCreateLoader
method called?Don't use/try to use a
Loader
to insert data in theContentProvider
/Database. It works like a charm for queries because the loaders were designed to load data from a data source(not insert data), that is their purpose. If you want to insert data use anAsyncTask
(also have a look atAsyncQueryhandler
), a regular thread.