具有自定义查询的Android ContentProvider不显示数据
今天我很困惑,因为我的自定义内容提供商没有按预期工作。也就是说,我的三星S5安卓4.4.2没有显示列表中的任何数据。但是,更令人困惑的是,在Android模拟器Genymotion中,它使用的是同一个Android版本。为什么?具有自定义查询的Android ContentProvider不显示数据,android,android-sqlite,android-contentprovider,Android,Android Sqlite,Android Contentprovider,今天我很困惑,因为我的自定义内容提供商没有按预期工作。也就是说,我的三星S5安卓4.4.2没有显示列表中的任何数据。但是,更令人困惑的是,在Android模拟器Genymotion中,它使用的是同一个Android版本。为什么? private static final String AUTHORITY = "[PACKAGE_NAME].helper.db.provider.PublicationContentProvider"; public static final Uri CONTENT
private static final String AUTHORITY = "[PACKAGE_NAME].helper.db.provider.PublicationContentProvider";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + PublicationColumns.TABLE_NAME);
public static final int PUBLICATIONS = 1;
public static final int PUBLICATION_ID = 2;
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI(AUTHORITY, PublicationColumns.TABLE_NAME, PUBLICATIONS);
sURIMatcher.addURI(AUTHORITY, PublicationColumns.TABLE_NAME + "/#", PUBLICATION_ID);
}
private static final Map<String, String> sProjectionMap = new HashMap<String, String>();
static {
sProjectionMap.put(PublicationColumns._ID, PublicationColumns.KEY_FULL_ID);
sProjectionMap.put(PublicationColumns.KEY_PUBLICATION_CODE, PublicationColumns.KEY_FULL_PUBLICATION_CODE);
sProjectionMap.put(PublicationColumns.KEY_PUBLICATION_NAME, PublicationColumns.KEY_FULL_PUBLICATION_NAME);
sProjectionMap.put(PublicationColumns.KEY_PUBLICATION_THUMBNAIL, PublicationColumns.KEY_FULL_PUBLICATION_THUMBNAIL);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
String query = "SELECT " + PublicationColumns.KEY_FULL_ID + ", " + PublicationColumns.KEY_FULL_PUBLICATION_NAME + ", "
+ PublicationColumns.KEY_FULL_PUBLICATION_CODE + ", " + PublicationColumns.KEY_FULL_PUBLICATION_THUMBNAIL
+ " FROM " + PublicationColumns.TABLE_NAME + " WHERE " + PublicationColumns.KEY_FULL_ID + " IN (SELECT "
+ AbocodePublicationColumns.KEY_FULL_PUBLICATION_ID + " FROM " + AbocodePublicationColumns.TABLE_NAME
+ " WHERE " + AbocodePublicationColumns.KEY_FULL_ABO_ID + " IN (SELECT " + LoginColumns.KEY_FULL_ID
+ " FROM " + LoginColumns.TABLE_NAME + " WHERE " + LoginColumns.KEY_FULL_LOGIN_VALID + "='1'));";
int uriType = sURIMatcher.match(uri);
boolean useCustomQuery = false;
switch (uriType) {
case PUBLICATION_ID:
queryBuilder.appendWhere(PublicationColumns._ID + "=" + uri.getLastPathSegment());
break;
case PUBLICATIONS:
if (projection == null && TextUtils.isEmpty(selection)) {
useCustomQuery = true;
}
break;
default:
throw new IllegalArgumentException("Unknown URI");
}
Cursor cursor;
if (useCustomQuery) {
cursor = dbAdapter.getReadableDatabase().rawQuery(query, null);
} else {
queryBuilder.setTables(PublicationColumns.TABLE_NAME);
queryBuilder.setProjectionMap(sProjectionMap);
cursor = queryBuilder.query(dbAdapter.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder);
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
....
我还尝试了QueryBuilder和默认查询,但结果相同。好像我改变了什么,但我不知道是什么。但是,在模拟器中,一切都很好!任何帮助都将不胜感激
编辑//
在安卓4.2.2的旧设备上,它也能工作。唯一一款无法使用的设备是我的三星Galaxy S5
谢谢大家! 数据库中的数据是否在所有设备上都相同?是的,数据来自用户需要帐户的服务器。但我用相同的账户和数据测试了所有这些。