Android “的含义和目的”';1'&引用;在ContentResolver查询中

Android “的含义和目的”';1'&引用;在ContentResolver查询中,android,android-contentprovider,android-contentresolver,android-query,Android,Android Contentprovider,Android Contentresolver,Android Query,为什么我们要在Selecion查询中放入“=“1” 以及String.valueOf(1)的原因您的意思可能是: String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER " + " = '1''"; String[] selectionArgs = String.valueOf(1); 还是这个 String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "

为什么我们要在Selecion查询中放入
“=“1”


以及
String.valueOf(1)的原因

您的意思可能是:

String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER " + " = '1''";
String[] selectionArgs = 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 + " = ?";
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;
所有四个选项都有相同的结果:有电话号码的联系人

SQLite(Android上使用的数据库类型)不支持布尔值(请参阅),
true
false
通常存储为整数
1
0
。因此,要检查布尔字段是否为真,您需要检查它是否具有值
1

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


如果在select语句中不使用任何变量,则只需在语句中插入所有值,而不使用占位符和
selectionArgs
,如代码片段#3和#4所示。由于SQLite是动态类型的,所以如果您检查是否与
1
'1'
相等,则无所谓,SQL解释器将以任何一种方式获得正确的结果。

这看起来不像是有效的Java代码。另外,请为我们的代码片段添加更多上下文
selection
SelectionAgs
似乎不属于一起。这是一个愚蠢的问题,我只是发布了它,没有研究query()方法的细节。谢谢你的回答。