String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER " + " = '1''";
String[] selectionArgs = String.valueOf(1);
为什么我们要放入" = '1' "
选择查询?
以及原因String.valueOf(1);
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;
所有四个选项都有相同的结果: 有电话号码的联系人。
SQLite(Android 上使用的数据库类型)不支持布尔值(请参阅SQLite 版本 3 中的数据类型),true
并且false
通常存储为整数1
和0
. 因此,要检查布尔字段是否为真,请检查它是否具有 value 1
。
代码片段 #1 和 #2 使用一个准备好的语句,其中包含一个参数或占位符,该参数或占位符被替换为selectionArgs
数组的第一个值(因为它是查询中的第一个参数)。这是一种防止 SQL 注入的技术,它通常使您的查询更具可读性。
selectionArgs
必须是一个String
值数组,因此代码段#1 中的整数值1
需要转换为String
第一个值(String.valueOf(int)
实际上只有在传递变量而不是常量时才有意义)。
如果您在 select 语句中不使用任何变量,您可以将所有值插入到语句中,而不使用占位符,selectionArgs
如代码片段 #3 和 #4 所示。1
由于 SQLite 是动态类型的,因此检查与or是否相等无关紧要'1'
,SQL 解释器会以任何一种方式正确处理。