Урок 52. SimpleCursorAdapter, пример использования

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 52. SimpleCursorAdapter, пример использования

Сообщение damager82 » 30 янв 2012, 07:16

В этом уроке:

- используем SimpleCursorAdapter для построения списка
- добавляем и удаляем записи в списке

[url=http://www.startandroid.ru/ru/uroki/vse ... l:3itzgxeb]Click here to read this article![/url:3itzgxeb]
Последний раз редактировалось damager82 08 май 2017, 16:00, всего редактировалось 10 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

lics
Сообщения: 10
Зарегистрирован: 03 фев 2012, 19:11

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение lics » 03 фев 2012, 19:47

Модифицировал данный пример т.о., что при кликаньи на иконку, производятся некие действия с записью, соответствующей элементу списка, на котором эта запись находится.

Код: Выделить всё

public void onButtonItemClick(View view) {
	    int id = cursor.getInt(cursor.getColumnIndex(DB.COLUMN_ID));
            //
            //  modify record
            //  
	    refreshCursor();
	    scAdapter.changeCursor(cursor);
	}
Проблема в том, что в данном обработчике, курсор указывает на запись, не соответствующую элементу списка, на котором кликнули. Получается, что на самом деле курсор ссылается на запись, находящуюся в начале или конце экрана. (Если вместо имиджа поставить кнопку эффект будет тот же) Если клацнуть сначала на саму запись (не на имидж),а потом на имидж, этого же элемента списка, то все в порядке, курсор соответствует элементу списка. Можно ли в данной ситуации, как-то добиться синхронизации между курсором и списком, при клике на кнопке и обойтись без двойного нажатия ?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение damager82 » 07 фев 2012, 12:53

А как вы повесили обработчик на картинку?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

lics
Сообщения: 10
Зарегистрирован: 03 фев 2012, 19:11

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение lics » 07 фев 2012, 13:51

В xml, в секции <ImageView>, по аналогии с кнопкой "добавить запись"

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	 xmlns:android="http://schemas.android.com/apk/res/android"
	 android:layout_width="match_parent"
	 android:layout_height="wrap_content"
	 android:orientation="horizontal">
	<ImageView
		android:id="@+id/ivImg"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
	 	android:onClick="onButtonItemClick"
		android:src="@drawable/folder">
	</ImageView>
	<TextView
		android:id="@+id/tvName"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_gravity="center_vertical"
		android:layout_marginLeft="10dp"
		android:text=""
		android:onClick="onGroupClick"
		android:textSize="14sp">
	</TextView>
</LinearLayout>

lics
Сообщения: 10
Зарегистрирован: 03 фев 2012, 19:11

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение lics » 09 фев 2012, 12:15

Уже разобрался, синхронизации между списком и курсором удалось достичь, добавив в обработчик нажатия код:

Код: Выделить всё

  public void onButtonItemClick(View v) {
	  int pos = lvData.getPositionForView(v);
	  cursor.moveToPosition(pos);
          .................................
  }

lics
Сообщения: 10
Зарегистрирован: 03 фев 2012, 19:11

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение lics » 09 фев 2012, 13:30

Вопрос по оптимальности
Допустим, что основная часть приложения получает по некому условию выборку из базы данных (до 600 записей) и выводит интерфейс для корректировки этих данных в виде таблицы.
С точки зрения простоты кода, вроде как, проще использовать SimpleCursorAdapter и держать постоянно активным курсор и соединение с SQlite, т.к. все время читаем и пишем.
Насколько такой подход оптимален с точки зрения использования ресурсов ?
Другой вариант, прочитать нужное из базы загрузить в массив, закрыть курсор и работать, через например CustomAdapter, обновляя массив и прописывая изменения в базу по мере обновления, кажется более громоздким. Стоит ли это все городить, только из за отсутствия постоянно открытого курсора ?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение damager82 » 11 фев 2012, 22:09

Хороший вопрос ...
Мне хочется верить, что Cursor заточен под такие задачи и ест не сильно больше памяти, чем массив или коллекция тех же данных.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

яфпкк
Сообщения: 8
Зарегистрирован: 21 фев 2012, 05:59

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение яфпкк » 13 мар 2012, 15:18

не знаю в какой теме задать вопрос, задам здесь.

Хочу вернуть из query определенный набор полей
Cursor cur = db.query("table1",new String[]{"name1,name2"},null.nulll,...);

При попытке передать этот курсор в SimpleCursorAdapter получаю ошибку "IllegalArgumentException: column '_id' does not exist"

в мане про CursorAdapter прочитал
Adapter that exposes data from a Cursor to a ListView widget. The Cursor must include a column named "_id" or this class will not work.

т.е. я прально понимаю, если я собираюсь передавать курсор в SimpleCursorAdapter, то в нем ВСЕГДА должен быть столбец _id, даже если он мне не нужен???

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение KamiSempai » 14 мар 2012, 15:23

яфпкк писал(а):...если я собираюсь передавать курсор в SimpleCursorAdapter, то в нем ВСЕГДА должен быть столбец _id, даже если он мне не нужен???
Да. Наличие столбца "_id", в данном случае, обязательно.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение damager82 » 26 мар 2012, 09:27

яфпкк писал(а):то в нем ВСЕГДА должен быть столбец _id, даже если он мне не нужен???
Да, причину я описал в уроке 38:
В различных источниках при работе с БД в качестве наименования поля-идентификатора в таблице используют не просто id, а _id. Почему?

Ответ нашелся в доках по Cursor-адаптерам. Цитата: "The Cursor must include a column named "_id" or this class will not work.". Т.е. если вы планируете использовать Cursor-адаптеры, то необходимо, чтобы таблица содержала поле _id, иначе адаптер не будет работать.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

irukanji
Сообщения: 12
Зарегистрирован: 26 мар 2012, 12:51

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение irukanji » 08 апр 2012, 14:08

такой вопрос- вы в своих уроках используете некоторые методы которые в Android считаются deprecated типа startManagingCursor() stopManagingCursor() и другие... Критично ли это для меня как новичка? И как заменить их на предпочтительные методы? Спасибо.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение KamiSempai » 08 апр 2012, 20:46

irukanji писал(а):Критично ли это для меня как новичка? И как заменить их на предпочтительные методы? Спасибо.
Лично я, для себя, отметил одно, если Эклипс не просит пометить метод как "deprecated", значит можно его использовать. Большинство предложений Гугла по замене "deprecated" методов применимо только к более высокой версии SDK. Следовательно, что является "deprecated" для Android 4.0, для Android 2.1 таковым может не являться. Все зависит от того на какую платформу Вы пишите приложение.
Конечно, чем выше версия Android тем больше возможностей появляется, но не стоит забывать, что при этом меньше людей смогут установить ваше приложение.

PS: Я тут про это уже спрашивал, но мне никто толком не ответил. Пришлось делать выводы самому. Надеюсь я не слишком заблуждаюсь.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение damager82 » 09 апр 2012, 09:56

KamiSempai писал(а):Надеюсь я не слишком заблуждаюсь.
Я примерно также вижу ситуацию. Если хотите использовать то, что Android предлагает вместо deprecated методов, то можно подключить support packages и юзать новые возможности. Для этого надо залить их через SDK-manager и добавить в проект. Тут мануалка: http://developer.android.com/sdk/compat ... brary.html
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение KamiSempai » 09 апр 2012, 12:08

damager82 писал(а):Тут мануалка: http://developer.android.com/sdk/compat ... brary.html
Спасибо, нужно будет почитать, как нибудь.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Grigory
Сообщения: 7
Зарегистрирован: 30 май 2012, 15:51

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Grigory » 31 май 2012, 15:55

как вытащить нужную строку из базы зная номер id ?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение damager82 » 31 май 2012, 17:21

Grigory писал(а):как вытащить нужную строку из базы зная номер id ?
Метод query, урок 36.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

inomqvo9
Сообщения: 1
Зарегистрирован: 05 июн 2012, 07:05

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение inomqvo9 » 05 июн 2012, 07:09

Спасибо за познавательный урок!
Не подскажете, каким образом можно менять цвет или размер текста в зависимости от значений из БД?

gaydamaka
Сообщения: 2
Зарегистрирован: 01 июн 2012, 14:25

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение gaydamaka » 05 июн 2012, 13:59

Здравствуйте, у меня выдает ошибку на создание адаптера, не подскажите что это может быть

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение damager82 » 06 июн 2012, 09:25

inomqvo9 писал(а):Спасибо за познавательный урок!
Не подскажете, каким образом можно менять цвет или размер текста в зависимости от значений из БД?
Есть пара способов. В уроках 49 и 50 я об этом рассказывал.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение damager82 » 06 июн 2012, 09:26

gaydamaka писал(а):Здравствуйте, у меня выдает ошибку на создание адаптера, не подскажите что это может быть
А что конкретно пишет?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Ответить