Java Android SQLite select语句奇怪的行为

Java Android SQLite select语句奇怪的行为,java,android,sqlite,Java,Android,Sqlite,我正在学习android,所以我决定制作一个简单的短信应用程序。事情进展得很顺利,但我遇到了一个问题,我认为我可以绕过这个问题,但我还是想知道为什么会发生 我会尽量不用多余的代码来打扰你,但我会编辑这个问题,如果需要的话会发布更多 结构: 我有一门课: public class MyDatabaseHelper extends SQLiteOpenHelper 它处理数据库操作 其中,我有以下方法: public Contact getContactFromPhoneNumber(String

我正在学习android,所以我决定制作一个简单的短信应用程序。事情进展得很顺利,但我遇到了一个问题,我认为我可以绕过这个问题,但我还是想知道为什么会发生

我会尽量不用多余的代码来打扰你,但我会编辑这个问题,如果需要的话会发布更多

结构:

我有一门课:

public class MyDatabaseHelper extends SQLiteOpenHelper
它处理数据库操作

其中,我有以下方法:

public Contact getContactFromPhoneNumber(String pn) {
    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT * FROM "+CONTACT_TABLE_NAME+" WHERE "+CONTACT_PHONE_NUMBER+"="+pn+";";
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        Contact contact = new Contact();
        contact.setId(cursor.getInt(cursor.getColumnIndex(CONTACT_PRIMARY_KEY)));
        contact.setFirstName(cursor.getString(cursor.getColumnIndex(CONTACT_FIRST_NAME)));
        contact.setLastName(cursor.getString(cursor.getColumnIndex(CONTACT_LAST_NAME)));
        contact.setPhoneNumber(cursor.getString(cursor.getColumnIndex(CONTACT_PHONE_NUMBER)));
        db.close();
        return contact;
    }
    db.close();
    return null;
}
它根据电话号码返回一个
联系人
对象

Contact类是一个简单的类,具有属性
fistName
lastName
phoneNumber
id
的getter和setter方法

还有一件事我需要提一下:

我将而不是向方法传递一些任意字符串值。我传递的值以前插入到数据库中,如下所示:

public void insertContact(String fn, String ln, String pn) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(CONTACT_FIRST_NAME, fn);
    cv.put(CONTACT_LAST_NAME, ln);
    cv.put(CONTACT_PHONE_NUMBER, pn);
    db.insert(CONTACT_TABLE_NAME, null, cv);
    db.close();
}
所以我传递给第一个方法的参数已经在数据库中了

联系人表中存储电话号码的字段类型为
TEXT

麻烦:

问题在于,当调用第一个方法时,如果参数是以
0
开头的字符串值,或者包含
+
字符(我需要
+
字符用于国家调用代码),那么它将返回
null

如果
pn
参数不是以
0
开头,或者不包含
+
则工作正常

示例:(结果在注释中)


知道为什么会发生这种情况吗?

您的数据存储为字符串,但这里的选择查询

String selectQuery = "SELECT * FROM "+CONTACT_TABLE_NAME+" WHERE "+CONTACT_PHONE_NUMBER+"="+pn+";";
。。。不将
pn
作为字符串文字引用。因为它可以解释为一个数字,所以没有语法错误,但它与前面的任何字符串
+
0
都不匹配

要在SQL中引用字符串文字,请使用单引号。但是,最好使用
占位符并在其中绑定值,如

String selectQuery = "SELECT * FROM "+CONTACT_TABLE_NAME+" WHERE "+CONTACT_PHONE_NUMBER+"=?;";
Cursor cursor = db.rawQuery(selectQuery, new String[] { pn });
String selectQuery = "SELECT * FROM "+CONTACT_TABLE_NAME+" WHERE "+CONTACT_PHONE_NUMBER+"=?;";
Cursor cursor = db.rawQuery(selectQuery, new String[] { pn });