Can I perform this Android query with ContentResolver.query()? (LEFT JOIN and CASE)

∥☆過路亽.° 提交于 2019-11-27 12:25:54

Nope, you can't do that kind of queries with the ContentResolver.query() method. You will need to write something like this:

SQLiteDatabase db = YourActivity.getDbHelper().getReadableDatabase();
String query = yourLongQuery;
Cursor c = db.rawQuery(query, null);
YourActivity.startManagingCursor(c);
c.setNotificationUri(YourActivity.getContentResolver(), YourContentProvider.CONTENT_URI);

Edit: Okay, so this doesn't actually solve the question asked, because eidylon is tied to an existing ContentProvider as mentioned in their question. However, this does cover how you do a JOIN if you own the ContentProvider source and API. So I'll leave it for those who want to know how to handle that case.


This is easy! But unintuitive... :)

query(Uri uri, String[] projection, String selection, 
String[] selectionArgs, String sortOrder)

Okay, so what is URI? Typically, you have one URI per table.

content://com.example.coolapp.contacts serves data out of your CONTACTS table. content://com.example.coolapp.groupmembers serves data out of your GROUPMEMBERSHIP table.

But URI is really just a string. Use it however you like. Make a block of code in your ContentProvider that responds to content://com.example.coolapp.contacts_in_group. Within that block of code in the ContentProvider, you can get raw access to your SQLite DB, unfettered by the limited query() data model. Feel free to use it!

Define your selection fields however you like. They don't have to map to table column names -- map them how you need to, in order to get your parameters in.

Define your projection how you need -- It may contain columns from both tables after the join.

Bing, you're done. Google does this same model internally in their own code -- Go look at the Contacts provider API -- you see "bla.RawContact" and "bla.Contact" and etc as content URIs. Each serves data out of the same table in the DB -- the different URIs just provide different views of that same table!

You can't do that because ContentResolver has only one query method:

    query(Uri uri, String[] projection, String selection, 
String[] selectionArgs, String sortOrder)

there's no parameter for tables or FROM clauses.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!