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

为什么我们要放入" = '1' "选择查询?

以及原因String.valueOf(1);

4

1 回答 1

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;

所有四个选项都有相同的结果: 有电话号码的联系人。

SQLite(Android 上使用的数据库类型)不支持布尔值(请参阅SQLite 版本 3 中的数据类型),true并且false通常存储为整数10. 因此,要检查布尔字段是否为真,请检查它是否具有 value 1

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

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

于 2016-04-11T20:59:05.837 回答