我正在尋找在我的應用程序中實現CursorLoader,但我有一個小問題,似乎沒有辦法只是傳遞一個原始查詢到CursorLoader構造函數。CursorLoader與rawQuery
我可能在文檔(和谷歌)中缺少一些東西,所以如果任何人都可以指向我一個簡單的方式來運行帶有CursorLoader類的原始查詢,我將不勝感激。否則,我將不得不用必要的功能創建我自己的CursorLoader類,這是我試圖避免的。
我正在尋找在我的應用程序中實現CursorLoader,但我有一個小問題,似乎沒有辦法只是傳遞一個原始查詢到CursorLoader構造函數。CursorLoader與rawQuery
我可能在文檔(和谷歌)中缺少一些東西,所以如果任何人都可以指向我一個簡單的方式來運行帶有CursorLoader類的原始查詢,我將不勝感激。否則,我將不得不用必要的功能創建我自己的CursorLoader類,這是我試圖避免的。
似乎沒有辦法只是將原始查詢傳遞給CursorLoader構造函數。
這是因爲CursorLoader
適用於內容提供商,而內容提供商不支持rawQuery()
。
所以,如果有人可以指向我一個簡單的方法來運行一個CursorLoader類的原始查詢,我將不勝感激。
這是不可能的,對不起。歡迎您創建自己的AsyncTaskLoader
,它可以訪問SQLite數據庫並支持rawQuery()
。事實上,如果我沒有看到有人把我打敗了,我可能會在今年晚些時候寫一篇。
原始查詢不直接支持,但你可以做一個骯髒的黑客:像
@Override
public synchronized Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
{
int uriType = sURIMatcher.match(uri);
switch (uriType)
{
case RAW_QUERY:
return dbHelper.getReadableDatabase().rawQuery(selection, selectionArgs);
}
[...]
}
我如何編寫內容Uri如果我需要訪問兩個表來回原始查詢uri。 –
**對於自定義搜索使用內容提供商從您的代碼調用 getContentResolver().query(RAWQUERY_CONTENT_URI, null, rawquery, args, null);
和實施內容提供商**
更改光標裝載機如下(以onCreateLoader)
return new CursorLoader(
getActivity(), // Context
PRODUCT.CONTENT_URI, // URI
PROJECTION, // Projection
PRODUCT.PRODUCT_NAME+ " like ?", // Selection
new String[]{"%" + mCurFilter + "%"}, // Selection args
PRODUCT.PRODUCT_NAME + " asc");
在您的供應商贊GE因此
//C is Cursor object
switch (uriMatch) {
case ROUTE_PRODUCT_ID:
// Return a single entry, by ID.
String id = uri.getLastPathSegment();
builder.where(PRODUCT._ID + "=?", id);
c = builder.query(db, projection, sortOrder);
assert ctx != null;
c.setNotificationUri(ctx.getContentResolver(), uri);
return c;
// break;
case ROUTE_PRODUCT:
// Return all known entries.
builder.table(PRODUCT.PRODUCT_TABLE_NAME)
.where(selection, selectionArgs);
c = builder.query(db, projection, sortOrder);
assert ctx != null;
c.setNotificationUri(ctx.getContentResolver(), uri);
return c;
這將是一個開始:http://stackoverflow.com/questions/7182485/usage-cursorloader-without-contentprovider –
我不知道這是完全真實的,可能造成我2幾天的紅鯡魚。我在我的SQLiteOpenHelper中有一個rawQuery,我有我所有的實際查詢。我從一個由cursorloader啓動的內容提供者調用它,它似乎工作正常。 – kpierce8
@ kpierce8:OP正在嘗試將「原始查詢」傳遞給「CursorLoader」,這不是嚴格支持的。 OP沒有討論ContentProvider的*實現*,它是你使用SQLiteOpenHelper和rawQuery()的地方。現在,有人可能實現一個ContentProvider,其中一個「原始查詢」被傳入,比如說query()的第三個參數,而不是簡單的WHERE子句(或者等價的)。而且,對於特定的'ContentProvider',您可以將「原始查詢」傳遞給'CursorLoader'。但是,這不是一個典型的方法。 – CommonsWare