Сложные запросы с SQLite в Android

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