代码之家  ›  专栏  ›  技术社区  ›  Omar Estrella

Android中SQLite查询抛出异常

  •  1
  • Omar Estrella  · 技术社区  · 16 年前

    我试图从我的Android应用程序中的SQLite数据库中获取一个对象。我知道联系人在数据库中,因为当我添加它并尝试按ID查找时,它会返回对象。但是,当我尝试按名字和姓氏查找时,它抛出了一个异常,而Im留下了一个空引用。以下是查询:

    cursor = mDb.query(DB_CONTACTS_NAME,
        new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS,
                     KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION},
        KEY_FIRST_NAME + "=" + first + " AND " + KEY_LAST_NAME + "=" + last,
        null, null, null, null
    );
    

    我也试着用姓和名来查找。结果同上。

    编辑:异常是SQLite异常

    no such column: aurelius: , while compiling: SELECT _id, last_name, first_name,
    email_address, organization_name, label, label_position FROM contacts WHERE
    first_name=marcus AND last_name=aurelius
    

    当试图只选择名字或姓氏时也会发生这种情况

    no such column: marcus: , while compiling: SELECT _id, last_name, first_name,
    email_address, organization_name, label, label_position FROM contacts WHERE
    first_name=marcus
    
    2 回复  |  直到 15 年前
        1
  •  3
  •   Akusete    16 年前

    您需要引用文本字符串。这应该起作用:

    cursor = mDb.query(DB_CONTACTS_NAME,
        new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS,
                     KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION},
        KEY_FIRST_NAME + "='" + first + "' AND " + KEY_LAST_NAME + "='" + last + "'",
        null, null, null, null
    );
    

    first_name=marcus
    

    您不能期望它知道“marcus”不是表名或变量。

    在旁注上,尝试搜索姓氏 “比利”);“删除表联系人;”

    DO NOT CONSTRUCT SQL QUERIES FROM DATA STRINGS

    String[] myArguments = new String[] {first, last};
    cursor = mDb.query("SELECT * FROM contacts WHERE first_name = ? AND last_name = ?;", myArguments);
    

    这样安全多了。在您的版本中,如果“first”或“last”变量包含SQLite解释为命令的控制字符,则可能会破坏数据库系统。 不要这样做 ... 曾经

        2
  •  0
  •   charles young    15 年前

    按键名+“=”+首字母+“'和”+按键姓+“=”+尾字母+“'”