Mysql 使用ContentProviderClient从外部应用程序查询ContentProvider
我已经为一个问题挣扎了几天。我正在与两个不同的应用程序app a和app B共享一个内容提供商。有关DB创建和内容提供商管理的所有工作都由app a完成。app B仅使用相应的权限和内容提供商客户端访问它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
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;
}