我在SugarORM的ORM和底层SQLite数据库之间插入一个ContentProvider层,以便能够使用SyncAdapter。
ORM有这样的方法:
public static <T extends SugarRecord<?>> List<T> find(Class<T> type,String whereClause,String[] whereArgs,String groupBy, String orderBy, String limit)
很好地匹配SQLiteDatabase的查询方法:
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
问题是ContentProvider只有一个查询方法与必要的参数不匹配:
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
所以我考虑将ORM中的参数转换为SQL查询,然后将其传递给我的方法,然后可以运行原始查询并返回游标,如下所示:
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
{
switch (uriMatcher.match(uri))
{
case RAW_QUERY:
cursor = db.rawQuery(selection, selectionArgs);//query, arguments
...
第一个问题是不推荐使用SQLiteQueryBuilder的this method:
buildQuery (String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit)
所以我试过这个:
Object args[] = whereArgs;
String where_query = String.format(whereClause, args);
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables(getTableName(type));
String query = builder.buildQuery(null, whereClause, whereArgs, groupBy, null, orderBy, limit);
但结果查询字符串为空。
有什么建议吗?
答案 0 :(得分:0)
public Cursor query(Uri iUri, String[] iProjection, String iSelection,
String[] iSelectionArgs, String iSortOrder) {
SQLiteQueryBuilder mBuilder = new SQLiteQueryBuilder();
mBuilder.setTables(Database.KEY_TABLE);
switch (uriMatcher.match(iUri)) {
case RAW_QUERY:
mBuilder.appendWhere(Database.KEY_ROWID);
break;
default:
throw new IllegalArgumentException("Unsupported URI: " + iUri);
}
Cursor cursor = mBuilder.query(db, iProjection, iSelection,
iSelectionArgs, null, null, iSortOrder);
return cursor;
}
在你的代码中尝试这个我认为这将解决你的问题。