#android #sqlite
#Android #sqlite
Вопрос:
У меня есть таблица с 3 столбцами «ID», «NAME» и «STATUS». Я хотел бы выполнить запрос к моей базе данных, где я могу получить только одну запись «ID», которая находится в верхней строке. У меня есть рабочий SQL-запрос,
"SELECT TOP 1 ID from SAMPLE_TABLE WHERE Status='PENDING' ORDER BY ID ASC;"
Это пока то, что я реализовал в Android,
// Getting pending items
public int pendingContact() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor mCount = db.query(
TABLE_CONTACTS ,
new String[] { "id" } ,
"status = ?" ,
new String[] { "PENDING" } ,
null ,
null ,
null
);
mCount.moveToFirst();
int count = mCount.getInt(0);
mCount.close();
return count;
}
Al через него дает желаемый результат, но я хотел бы знать, есть ли какой-либо другой способ сделать это более эффективно.
Ответ №1:
Вы можете использовать Limit
общедоступный запрос курсора (таблица строк, столбцы строк [], выбор строки, параметры выбора строки [], группировка строк, наличие строк, порядок строк, ограничение строк)
limit — ограничивает количество строк, возвращаемых запросом, в формате предложения LIMIT. Передача null означает отсутствие предложения LIMIT.
Вы можете сделать это:
Cursor mCount = db.query(TABLE_CONTACTS, new String[] { "id" }, "status = ?", new String[] { "PENDING" }, null, null, "id ASC", "1");
Это позволит вам не получать больше данных, чем вам нужно.
Комментарии:
1. Рабочий запрос выполняет. Без сортировки результат был бы случайным.
2. Существует ПОРЯДОК ПО идентификатору ASC.
3. Ха-ха, да, спасибо, что постоянно доводите дело до конца. Его код этого не делает, но я не пытался перечитывать запрос, не относящийся к Android. 🙂 Спасибо CL.
Ответ №2:
Когда вы используете ORDER BY, база данных будет считывать и сортировать все PENDING
элементы, прежде чем сможет вернуть первый.
При использовании MIN временно должно храниться только наименьшее значение:
SELECT MIN(id) FROM Contacts WHERE Status = 'PENDING'
В коде:
Cursor mCount = db.rawQuery("SELECT MIN(id) FROM Contacts WHERE Status = ?",
new String[] { "PENDING" });