Android SQLite选择语句奇怪的行为

时间:2014-03-14 13:52:45

标签: java android sqlite

我正在学习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个对象。

Contact class是一个简单的类,包含属性fistNamelastNamephoneNumberid的getter和setter方法。

我需要注意的另一件事:

将一些任意String值传递给该方法。我传递的值以前插入数据库中,如下所示:

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

问题:

问题是当第一个方法被调用时,某个String值作为参数,以0开头或包含+个字符(我需要+个字符用于国家/地区的调用代码)对于上述方法,它返回null

如果pn参数不以0开头或包含+,则效果很好。

示例:(结果在评论中)

Contact c = getContactFromPhoneNumber("123456")  // c != NULL

Contact c = getContactFromPhoneNumber("1023")  // c != NULL

Contact c = getContactFromPhoneNumber("0123")   // c = NULL

Contact c = getContactFromPhoneNumber("+3816035")   // c = NULL

Contact c = getContactFromPhoneNumber("123+123")   // c = NULL

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

您的数据存储为字符串,但此处选择查询...

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 });