Mysql 使用ContentProviderClient从外部应用程序查询ContentProvider

Mysql 使用ContentProviderClient从外部应用程序查询ContentProvider,mysql,group-by,android-contentprovider,Mysql,Group By,Android Contentprovider,我已经为一个问题挣扎了几天。我正在与两个不同的应用程序app a和app B共享一个内容提供商。有关DB创建和内容提供商管理的所有工作都由app a完成。app B仅使用相应的权限和内容提供商客户端访问它 ContentProviderClient myCPClient = this.miContext.getContentResolver().acquireContentProviderClient(this.miUri); 当试图以更复杂的方式查询数据库时会出现问题,即使用一些关键字,如G

我已经为一个问题挣扎了几天。我正在与两个不同的应用程序app a和app B共享一个内容提供商。有关DB创建和内容提供商管理的所有工作都由app a完成。app B仅使用相应的权限和内容提供商客户端访问它

ContentProviderClient myCPClient = this.miContext.getContentResolver().acquireContentProviderClient(this.miUri);
当试图以更复杂的方式查询数据库时会出现问题,即使用一些关键字,如GROUP BY、HAVING等。我需要根据要使用GROUP BY的特定列获取唯一引用,并且我发现ContentProviderClient没有rawQuery方法,但与类SQLiteDatabase中可用的查询方法相比,这是一种简化的查询方法,它允许制定适当的MySQL命令

我已经检查过了,但是因为我的ContentProvider是从不同的应用程序访问的,所以我没有任何类似MyContentProvider的类


总而言之,有没有什么方法可以像rawQuery一样对由不同应用程序生成的ContentProvider进行适当的查询

我终于找到了一个相当简单和明智的解决办法。我得到了一个关于内容提供者和内容解析器的很好的解释。后者用于访问前者,这意味着它们不能控制提供者中的内容,而是从提供者获取数据。这意味着,如果未在相应ContentProvider的查询方法中实现rawQuery,则无法使内容提供程序客户端使用该查询

为了解决我的问题,我在我的提供者客户端中使用了一个标志,并修改了我的内容提供者以读取它,这样我就可以使用GROUPBY。我只是想根据特定的列从数据库中获取唯一的引用

这就是解决方案,它不是一个非常干净的解决方案,但它工作得相当好。 对于ContentProviderClient

在ContentProvider中

问候,

ContentProviderClient myCPClient = this.miContext.getContentResolver().acquireContentProviderClient(this.miUri);
//I declare some variables for the query
//'selection' will get all the rows whose "_id" is greater than 0, i.e. all the rows
String selection = BaseDatosParam.Tabla._ID + ">?";
String[] selectionArgs = {"0"};
//'groupBy' is not formatted in any particular way. I just need it to contain the     pattern "GROUP BY"
String groupBy = "GROUP BY" + BaseDatosParam.Tabla.REF; 
//the last field of the query corresponds to 'sortOrder', but I 
Cursor c = myCPClient.query(Uri.parse(miUri.toString()),
                projection, selection, selectionArgs, groupBy);
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 
{
    String where = selection;
    String groupBy = null;

    SQLiteDatabase db = this.miBDManager.getWritableDatabase();
    //We just check out whether 'sortOrder' includes the pattern "GROUP BY", otherwise that field will remain null
    Pattern myPat = Pattern.compile("GROUP BY");
    Matcher myMat = myPat.matcher(sortOrder);
    if (myMat.find())
        groupBy = myMat.replaceFirst(""); 

    Cursor c = db.query(BaseDatosParam.Tabla.NOMBRE_TABLA, projection, where, selectionArgs, groupBy, null, null);
    c.setNotificationUri(this.getContext().getContentResolver(), uri);

    return c;
}