使用buildQuery调用通过ContentProvider公开的数据库的查询方法

时间:2014-04-01 15:04:15

标签: android android-sqlite android-contentprovider

我在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);

但结果查询字符串为空。

有什么建议吗?

1 个答案:

答案 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;
    }

在你的代码中尝试这个我认为这将解决你的问题。