【问题标题】:Filter inputs in custom ContentProvider functions过滤自定义 ContentProvider 函数中的输入
【发布时间】:2010-12-26 19:34:35
【问题描述】:

在自定义ContentProvider 中,我需要过滤掉输入中指定的一些列。鉴于面向文本的 Android 界面,这让我很难受。

例如,MyContentProvider.query() 上的输入实际上会询问以下内容:

SELECT column_a, column_b FROM my_table WHERE column_a=1 AND column_b=red;

问题是在这个特定的MyContentProvider _column_b_ 可能没有任何意义并且不会出现在表中。过滤投影以便只保留相关列可以很容易地完成,因为它是一个字符串 []。但是,过滤这些列的字符串“where”(选择)和“selectionArgs”输入并非易事。如果处理得当,它将变成:

SELECT column_a FROM my_table WHERE column_a=1;

否则会收到SQLiteException "no such column"。

那么,是否有任何简单的方法可以从这样的 sql 语句中忽略或过滤列,或者我是否需要为选择部分编写一些智能但非常有限的正则表达式解析代码? p>

我没有得到正确输入的原因是因为我维护了一个自定义 ContentProvider 作为地址接口,但我在这里(在后台)与多个自定义 ContentProviders 交谈。无论如何,我需要在某处过滤选择。

请注意,我并不是简单地询问如何进行查询或使用SELECT ... WHERE 语句。但是它涉及我对query() 函数的实现。

【问题讨论】:

    标签: sql android android-contentprovider


    【解决方案1】:

    既然您使用ContentProvider 扩展您的MyContentProvider,为什么不重载query() 方法?

    查看ContentProvider - Sharing Content using the ContentProvider 了解其他人关于如何创建自定义 ContentProvider 的示例。您应该可以完全控制从 SQLiteDatabase 获取的数据。

    更重要的是,查看arguments provided 到query(),因为它们包含您需要的信息,您可以根据传递给方法调用的内容动态构建查询。

    根据您是否可以找到一个好的查询构建器,您有机会构建一个小而强大的抽象层来构建您的查询,从而最大限度地减少您自己编写的实际 SQL 的数量。

    另外,请始终记住清理您的输入!

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 2017-11-03
      • 2017-11-22
      • 2015-07-18
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多