【问题标题】:Android content resolver query placeholder integerAndroid 内容解析器查询占位符整数
【发布时间】:2015-03-02 19:02:26
【问题描述】:

我正在尝试在 android Browser Content Provider 上运行一个简单的查询。书签与历史项目混合在一起,因此只需选择“Browser.BookmarkColumns.BOOKMARK = 1”即可获取书签。使用

String mSelectionClause = Browser.BookmarkColumns.BOOKMARK + " = 1";

Cursor cursor = getContentResolver().query(Browser.BOOKMARKS_URI, null, mSelectionClause, null, null);

工作正常。但是我所有使用占位符获得相同结果的尝试都失败了:

String mSelectionClause = Browser.BookmarkColumns.BOOKMARK + " = ?";

查询:

Cursor cursor = getContentResolver().query(Browser.BOOKMARKS_URI, null, mSelectionClause, mSelectinArgs, null);

在所有这些情况下都返回一个空光标:

mSelectionArgs[0] = "1"
mSelectionArgs[0] = '1'
mSelectionArgs[0] = String.valueOf(1)
mSelectionArgs[0] = Integer.toString(1)
mSelectionArgs[0] = 1 + "" (idea picked up on this site)

我做错了什么还是应该放弃使用占位符的希望?

干杯。

【问题讨论】:

    标签: android arguments selection


    【解决方案1】:

    Android 数据库 API 是为字符串而非整数设计的。有人说这是 API 设计的错误。

    无论如何,在您的示例 String mSelectionClause = Browser.BookmarkColumns.BOOKMARK + " = 1"; 中,您使用的是整数 (= 1)。这是处理整数的最好也是唯一的方法。这样做也是安全的。如果您要使用字符串,您的第二种解决方案将是最安全的。

    【讨论】:

    • 谢谢。所以经验法则是“当数据库字段是字符串时使用占位符,其他类型的值直接在选择子句中”?如果我可以更进一步,避免硬编码值的好方法是什么?可以在子句中使用提供者定义的常量吗?还是资源字符串?
    • 如果你纯粹是在谈论代码设计,是的,如果你知道 Browser.BookmarkColumns.BOOKMARK 的值总是 1,你可以使用一个常量,甚至可以将整行写成一个常量( mSelectionClause 在您的情况下)。如果您在 BOOKMARK 上有很多相同条件的查询,SelectionBuilder 类可以帮助您重构代码并使选择更简单:developer.android.com/samples/BasicSyncAdapter/src/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2013-07-31
    相关资源
    最近更新 更多