ContentResolver 查询中“='1'”的含义和目的

Meaning and Purpose of " = '1' " in ContentResolver Query

String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER " + " = '1''";
String[] selectionArgs = String.valueOf(1);

为什么我们在选择查询中放入 " = '1' "

以及 String.valueOf(1);

的原因

你可能是这个意思:

String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?";
String[] selectionArgs = new String[]{String.valueOf(1)};

或这个

String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?";
String[] selectionArgs = new String[]{"1"};

或这个

String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'";
String[] selectionArgs = null;

或者只是这个

String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = 1";
String[] selectionArgs = null;

所有四个 select 离子具有相同的结果:具有 phone 编号的接触。

SQLite(在 Android 上使用的数据库类型)不支持布尔值(参见 Datatypes in SQLite Version 3),truefalse 是通常存储为整数 10。因此,要检查布尔字段是否为真,您需要检查它是否具有值 1.

代码片段 #1 和 #2 使用 prepared statement,其中包含一个参数或占位符,该参数或占位符已替换为 selectionArgs 数组的第一个值(因为它是查询中的第一个参数)。这是一种防止 SQL 注入的技术,它通常使您的查询更具可读性。 selectionArgs 必须是 String 值的数组,因此代码段 #1 中的整数值 1 需要首先转换为 String(使用 String.valueOf(int)实际上只有当你传递一个变量而不是一个常量时才有意义。

如果您不在 select 语句中使用任何变量,您可以将所有值插入到语句中,而不使用占位符和 selectionArgs,如代码片段 #3 和 #4 中所示。由于 SQLite 是动态类型的,因此无论您检查 1 还是 '1' 是否相等都没有关系,SQL 解释器将以任何一种方式正确处理。