【问题标题】:rawQuery a ContentProvider from an external app using a ContentProviderClientraw使用 ContentProviderClient 从外部应用程序查询 ContentProvider
【发布时间】:2014-02-13 20:32:19
【问题描述】:

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

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

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

我已经检查了这个answer,但是由于我的 ContentProvider 是从不同的应用程序访问的,所以我没有像 MyContentProvider 这样的任何类。

总而言之,有没有办法对由不同应用程序生成的 ContentProvider 进行正确的查询(如 rawQuery())?

【问题讨论】:

    标签: mysql group-by android-contentprovider


    【解决方案1】:

    我终于找到了一个相当简单和明智的解决方案。我对 Content Providers 和 Content Resolvers 有很好的解释。后者用于访问前者,这意味着他们无法控制提供者中的内容,而是从它们那里获取数据。这意味着如果在对应的ContentProviderquery() 方法中没有实现(覆盖)rawQuery(),则您不能让 Content Provider Client 使用它。

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

    这就是解决方案,虽然不是很干净,但效果很好。 对于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

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

    问候,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      相关资源
      最近更新 更多