Страница 1 из 1
Как осуществить поиск в Cursor?
Добавлено: 17 окт 2014, 07:16
grem17
Добрый день
Чтобы часто не обращаться к БД запросами - делаю выборку всех данных при создании основной активности (в переопределенном методе onCreate), данные помещаю в cursor, который делаю доступны для доступа из других функций private Cursor cursor;
вот так получил все данные
cursor = SQLWorkDB.GetCursor(nameDB, null, null, null, null, null, null);
вопросы:
1) как в курсоре найти то что мне нужно?
а) по URI
б) по переменной
2) можно ли, зная URI, к курсору имеющему все данные сделать еще один запрос курсором по конкретному URI
чтонить типа такого?
cursor = SQLWorkDB.GetCursor(nameDB, null, null, null, null, null, null);
UriDat=Uri.parse(str);
cursorNew = GetCursor(cursor, UriDat, null, null, null, null, null);
Re: Как осуществить поиск в Cursor?
Добавлено: 17 окт 2014, 08:00
grem17
пожалуй стоит уточнить
когда хочу выбрать данные по одной записи то пишу вот так
Код: Выделить всё
nameDB="db";
str="блаблабла";
Cursor cursor = GetCursor(nameDB, null, "name="+"'"+str+"'", null, null, null, null);
while (cursor.moveToNext()){
res = cursor.getString(cursor.getColumnIndex(t1));
}
public Cursor GetCursor(String table, String[] columns,String selection, String[] selectionArgs,String groupBy, String having, String sortOrder) {
SQLiteDatabase db = this.getWritableDatabase();
Cursor cur = db.query(table, columns, selection, selectionArgs, groupBy, having, sortOrder);
return cur;
}
этот способ хорош для разовой выборки, если заполнять с его помощью ListView - то при прокрутке жутко тормозит экран, хочу оптимизировать запросы...
сделать выборку из БД SQL в начале программы и потом с этой выборкой работать...а как это сделать - не знаю
сопоставление (заполнение) в ListView идет по имени поля типа String, а так же по URI
как взять из Cursor данные по URI и String?
Re: Как осуществить поиск в Cursor?
Добавлено: 17 окт 2014, 10:37
Foenix
неверный подход. Тут есть урок по Sqlite и простым запросам. Запросы могут быть очень сложные, и обращаться с ними нужно непосредственно в базу данных, а не копировать всю таблицу зачем-то в курсор, а потом его лопатить, пытаясь "найти" там что-то нужное.
sqlite заточена под запросы, выполняет их раз в 50 быстрее, чем ты будешь с помощью java искать что-либо где-либо.
запрашивать из таблиц нужно ровно столько записей, сколько тебе нужно, и ни на одну больше.
Re: Как осуществить поиск в Cursor?
Добавлено: 17 окт 2014, 11:56
grem17
хм, вот есть у меня например 100 записей в контактном листе, через симпл адаптер я вывожу их в listview и кажду строку обрабатываю в переопределнном методе
public View getView(int position, View convertView, ViewGroup parent)
каждую запись мне надо сопоставить с другой БД и вывести картинку (текст) из этой БД
сопоставление делаю через "имя" (String) и "адрес контакта" (URI)
причем контакт может иметь как оба значения, так и одно из них
получается следующее - при отрисовке каждой строки происходит запрос к двум БД (контактам телефона и моей БД), сопостовление работает корректно, но отрисовка жутко тормозит
хочу как то оптимизировать запросы или найти правильный подход для решения задачи
Re: Как осуществить поиск в Cursor?
Добавлено: 17 окт 2014, 15:37
KamiSempai
Выборка с условием по строке работает очень медленно, а у вас еще и очень длинная строка. Используйте связи по _ID или CONTACT_ID
http://developer.android.com/reference/ ... s.html#_ID
http://developer.android.com/reference/ ... CONTACT_ID
Re: Как осуществить поиск в Cursor?
Добавлено: 17 окт 2014, 16:21
Foenix
Я бы из getView не посылала запросы. Выберите сразу из контактов нужные тексты и ссылки на картинки и используйте их в getView, сто строк это не так уж много данных.
Если уж совсем медленно (что вряд ли), то нужно использовать что-то типа lazy listview, когда данные подгружаются порциями, пока юзер пялится на экран.
Я не согласна с постом выше, про "очень медленно", все нормально работает, но использовать ID, конечно, лучше, правда как это сделать нужно подумать. Можно, конечно, при заполнении вашей таблицы запихивать туда и соответсвтущий contact_id, но вот за актуальность этих данных никто не ответит - они могут меняться.
Re: Как осуществить поиск в Cursor?
Добавлено: 20 окт 2014, 10:51
KamiSempai
Foenix писал(а):Я бы из getView не посылала запросы. Выберите сразу из контактов нужные тексты и ссылки на картинки и используйте их в getView, сто строк это не так уж много данных.
Тут, видимо, проблема в том, что используется 2 совершенно не связанные таблицы. Нужно делать выборку сразу из 2 баз и писать кастомный адаптер на 2 курсора.
Foenix писал(а):Я не согласна с постом выше, про "очень медленно", все нормально работает, но использовать ID, конечно, лучше, правда как это сделать нужно подумать. Можно, конечно, при заполнении вашей таблицы запихивать туда и соответсвтущий contact_id, но вот за актуальность этих данных никто не ответит - они могут меняться.
Я бы за актуальность имени не ручался, чем за contact_id, что-что, а вот имя более непостоянная переменная.