我一直在为一个问题苦苦挣扎几天。我正与两个不同的应用程序(应用程序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()
)?
答案 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
此致