SQLite запрос на исключение в Android - PullRequest
1 голос
/ 29 июля 2010

Я пытаюсь получить объект из моей базы данных SQLite в моем приложении Android.Я знаю, что контакт находится в базе данных, потому что, когда я добавляю его и пытаюсь найти по идентификатору, он возвращает объект.Когда я пытаюсь найти по имени и фамилии, он выдает исключение, и я остаюсь с нулевой ссылкой.Вот запрос:

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 ]

3 голосов
/ 29 июля 2010

Вам нужно заключить в кавычки буквенные строки.Это должно работать:

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

В противном случае, когда интерпретатор SQL видит:

first_name=marcus

Вы не можете ожидать, что он знает, что 'marcus' не является именем таблицы или переменной.

В примечании попробуйте поискать фамилию "Billy" "); удалите контакты из таблицы;"

НЕ СОСТАВЛЯЙТЕ SQL-запросы из строк данных

Вместо этого используйте запрос, который принимает список аргументов.Ищите в документах что-то вроде

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

Это намного безопаснее.В вашей версии, если переменные 'first' или 'last' содержат управляющие символы, которые SQLite интерпретирует как команды, вы можете сломать систему базы данных. НЕ ДЕЛАЙТЕ ЭТОГО ... КОГДА-ЛИБО

0 голосов
/ 21 марта 2011

Да, это ответ! Хотел бы я иметь очки, чтобы проголосовать за это! В частности, строки предложения WHERE должны иметь одинарные кавычки:

KEY_FIRST_NAME + "= '" + first + "' AND" + KEY_LAST_NAME + "= '" + last + "'"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...