使用ContentProviderClient从外部应用程序rawQuery一个ContentProvider

时间:2014-02-13 20:32:20

标签: mysql group-by android-contentprovider

我一直在为一个问题苦苦挣扎几天。我正与两个不同的应用程序(应用程序A和应用程序B)共享内容提供程序。关于数据库创建和内容提供商管理的所有内容都由应用程序A完成。应用程序B只使用相应的权限和内容提供商客户端访问它。

ContentProviderClient myCPClient = this.miContext.getContentResolver().acquireContentProviderClient(this.miUri);

当尝试以更复杂的方式查询数据库时出现问题,即使用GROUP BY,HAVING等一些关键词。我需要根据一个特定列获得唯一引用(我想使用GROUP BY ),我发现rawQuery()没有ContentProviderClient方法,而是简化的query()方法(与类SQLiteDatabase中可用的方法相比较,允许制定适当的MySQL命令)。

我已经检查了这个answer,但由于我的ContentProvider是从其他应用访问的,因此我没有像MyContentProvider这样的课程。

总结一下,有没有办法对由其他应用生成的ContentProvider进行正确的查询(如rawQuery())?

1 个答案:

答案 0 :(得分:0)

我终于得到了一个相当简单明智的解决方案。我对内容提供商和内容解析器有很好的解释。后者用于访问前者,这意味着他们无法控制提供者中的内容,而是从中获取数据。这意味着,如果内容提供商客户端未在相应rawQuery()的{​​{1}}方法中实现(覆盖),则无法使其使用query()

要解决我的问题,我在我的提供程序客户端中使用了一个标志,并修改了我的内容提供程序以阅读它,以便我可以使用GROUP BY。我只想根据特定列从数据库中获取唯一引用。

这是解决方案,它不是一个非常干净的解决方案,但它的效果非常好。 对于ContentProvider

ContentProviderClient

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

ContentProvider

此致