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

Обсуждение уроков
Fogg
Сообщения: 7
Зарегистрирован: 18 авг 2013, 10:04

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

Сообщение Fogg » 22 авг 2013, 10:11

Foenix писал(а):а... поняла кажется
у тебя неверное понимание происходящего. При update строки таблицы не нужно знать или "копировать" все ее поля, нужно заменять те, которые тебя интересуют, т.е. эту строку просто убери.
Вот в чём ошибка, точно :) Этот кусок заработал, спасибо.
Но я всё равно не понял, как обращаться к полю базы данных. Можете, пожалуйста, написать, как это должно выглядеть в коде? У меня не выходит применить то, что Вы написали.
Сейчас я создал метод для увеличения на 1 поля int.

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

public void increment_by_one(long id) {
	  ContentValues cv = new ContentValues();
	  cv.put(COLUMN_IMG, (mDB.rawQuery(DB_TABLE , Long.toString(id) ) + 1 ));                    //(c.getInt(c.getColumnIndex(COLUMN_IMG)) + 1 ));
	  mDB.update(DB_TABLE, cv, COLUMN_ID + " = " + id, null); }
Что-то снова неправильно понял?
Описание класса выложил несколькими сообщениями ранее.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 22 авг 2013, 13:15

еще раз перечитай то, что я там писала. Можно обращаться по наименованию поля, например, к РЕЗУЛЬТАТАМ выполнения запроса, т.е. к курсору.
А том виде, что ты приводишь- у тебя курсора нету.
вся эта строчка cv.put(COLUMN_IMG, (mDB.rawQuery(DB_TABLE , Long.toString(id) ) + 1 )); - это надо стереть и больше так никогда не писать и даже не пытаться думать в эту сторону. Прочитай еще раз уроки по базам данных, в частности, запросам rawQuery повнимательнее.. ты идею не уловил
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Fogg
Сообщения: 7
Зарегистрирован: 18 авг 2013, 10:04

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

Сообщение Fogg » 23 авг 2013, 17:03

Всё, разобрался, спасибо. Совершенно забыл про execSQL :)
Новая проблема, возможно не в тот урок, но по этому проекту. Создал ещё два поля в базе данных - COLUMN_DATE (старая дата) и COLUMN_LAST (сколько дней прошло со старой даты). Как сделать так, чтобы она при входе в приложение пересчитывала колонку COLUMN_LAST? Вот код:

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

public void open() {
    mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
    mDB = mDBHelper.getWritableDatabase();
    
    Calendar localCalendar = Calendar.getInstance(TimeZone.getDefault());
    Cursor cursor = mDB.query(DB_TABLE, new String[] {COLUMN_ID, COLUMN_DATE} , null, null, null, null, null);
    while(cursor.moveToNext())
    {
        ContentValues cv = new ContentValues();
        int columnId = cursor.getInt(0); // cause COLUMN_ID is 0th in projection above
        cv.put(COLUMN_LAST, localCalendar.get(Calendar.DAY_OF_YEAR) - cursor.getInt(1));
        mDB.update(DB_TABLE, cv, COLUMN_ID + " = " + columnId, null);
    }
    cursor.close();
  }
Но приложение вылетает без объяснения причин.
Дебаггинг показал, что вылетает на строчке

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

mDB.update(DB_TABLE, cv, COLUMN_ID + " = " + columnId, null);
Но я не вижу ошибок нигде. Помогите, пожалуйста.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 23 авг 2013, 17:13

пересчитывать колонки в таблице плохая идея
Можно спросить - зачем?
без объяснения причин программа не вылетает, все написано в логе.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

TomPO
Сообщения: 6
Зарегистрирован: 24 авг 2013, 00:06

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

Сообщение TomPO » 26 авг 2013, 20:19

Ребят, а что делать, если у меня методы, как говорится, "is deprecated".
The method startManagingCursor(Cursor) from the type Activity is deprecated.
The constructor SimpleCursorAdapter(Context, int, Cursor, String[], int[]) is deprecated.
The method requery() from the type Cursor is deprecated.
Что использовать вместо этих методов?
Мне их eclipse зачеркивает. Но, пример работает, только данные не обновляются. Т.е. если удалить запись, то ничего не происходит, но если закрыть и открыть приложение, то удаленные данные больше не отображаются, то же и с вставкой новых данных. Что делать, какие методы использовать? Использую эмулятор 2.3.3.
Кстати, вообще, зачем метод startManagingCursor?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 26 авг 2013, 21:40

TomPO писал(а):Ребят, а что делать, если у меня методы, как говорится, "is deprecated".
The method startManagingCursor(Cursor) from the type Activity is deprecated.
The constructor SimpleCursorAdapter(Context, int, Cursor, String[], int[]) is deprecated.
The method requery() from the type Cursor is deprecated.
Что использовать вместо этих методов?
Мне их eclipse зачеркивает. Но, пример работает, только данные не обновляются. Т.е. если удалить запись, то ничего не происходит, но если закрыть и открыть приложение, то удаленные данные больше не отображаются, то же и с вставкой новых данных. Что делать, какие методы использовать? Использую эмулятор 2.3.3.
Кстати, вообще, зачем метод startManagingCursor?
да не только у тебя ))
Нужно переходить на ComtentProvider и CursorLoader. Тема сложная, большая. Но переходить нужно.
Кстати, мы скоро будем вебинары проводить, эта тема тоже будет.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 26 авг 2013, 22:06

Кстати, вообще, зачем метод startManagingCursor?
Этот метод передает управление активити жизненным циклом курсора в соответствии с жизненным циклом активити "Активити, управляй курсором".
Но, пример работает, только данные не обновляются. Т.е. если удалить запись, то ничего не происходит, но если закрыть и открыть приложение, то удаленные данные больше не отображаются, то же и с вставкой новых данных. Что делать, какие методы использовать? Использую эмулятор 2.3.3.
Значит что-то не так в программе. Там обновлять все это нужно в соответсвущих методах вручную командами Requery() - тоже deprecated и notifyDatasetChanged (вроде так пишется)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

TomPO
Сообщения: 6
Зарегистрирован: 24 авг 2013, 00:06

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

Сообщение TomPO » 01 сен 2013, 16:34

А подскажите, как работать с курсорами.
Меня итересует следующее:

Получаю контакты с симки

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

private final String SIM_COLUMN_NAME = "name";
//в методе onCreate
cursor = getContentResolver().query(Uri.parse("content://icc/adn/"),
				null, null, null, SIM_COLUMN_NAME + " asc");
Я хочу, чтобы полученная таблица была отсортирована по имени контакта, но никакой сортировки не происходит.
Ровно также не происходит и выбор записей, если прописать в методе query условие select.

Также интересно следующее:
Есть у меня там и EditText.
По моей задумке, пользователь вводит текст, и у него в ListView должны отображаться записи, содержащие введенный текст. Поэтому я сделал следующее:

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

EditText etFind;
etFind = (EditText)findViewById(R.id.etFind);
etFind.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
                                  }	
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}
			
			@Override
			public void afterTextChanged(Editable s) {
				cursor = getContentResolver().query(Uri.parse("content://icc/adn/"),
				null, " name like ?", new String[]{etFind.getText().toString() + "%"}, SIM_COLUMN_NAME + " desc");
cursor.requery();
			}
		});
Но ничего не происходит. Вообще...
Нужен совет, желательно с кодом.

snowkam
Сообщения: 162
Зарегистрирован: 21 мар 2013, 11:22

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

Сообщение snowkam » 03 сен 2013, 13:56

Добрый день.

Если добавить запись или удалить. То чтобы перерисовать данные нужно выполнить cursor.requery();
А как обновить если я меняю условия mDB.query(DB_TABLE, null, null, null, null, null, null); ????

cursor.requery(); - не помогает!

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

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

Сообщение KamiSempai » 03 сен 2013, 15:01

snowkam писал(а):Добрый день.

Если добавить запись или удалить. То чтобы перерисовать данные нужно выполнить cursor.requery();
А как обновить если я меняю условия mDB.query(DB_TABLE, null, null, null, null, null, null); ????

cursor.requery(); - не помогает!
Можно заменить курсор при помощи метода swapCursor. Этот метод подставляет в адаптер новый курсор и возвращает стары. Старый можно тут-же закрыть.
Например так:[syntax=java]mAdapter.swapCursor(newCursor).close()[/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

snowkam
Сообщения: 162
Зарегистрирован: 21 мар 2013, 11:22

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

Сообщение snowkam » 03 сен 2013, 16:00

Спасибо!
Вот еще вопрос.
Я наверное что-то пропустил но не могу найти как получить из базы данных значения поля
методы query(......) получает cursor. А как получить значение одного поля скажем типа String?

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

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

Сообщение KamiSempai » 03 сен 2013, 16:32

snowkam писал(а):Спасибо!
Вот еще вопрос.
Я наверное что-то пропустил но не могу найти как получить из базы данных значения поля
методы query(......) получает cursor. А как получить значение одного поля скажем типа String?
Все это было в уроке 34
http://startandroid.ru/ru/uroki/vse-uro ... qlite.html
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

snowkam
Сообщения: 162
Зарегистрирован: 21 мар 2013, 11:22

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

Сообщение snowkam » 04 сен 2013, 08:49

А где спасибо говорится, хочу этому камикадзе спасибо сказать!!!!!!!!????

Сейчас перечитаю все уроки по SQL!!!

snowkam
Сообщения: 162
Зарегистрирован: 21 мар 2013, 11:22

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

Сообщение snowkam » 04 сен 2013, 09:58

KamiSempai писал(а):Все это было в уроке 34
http://startandroid.ru/ru/uroki/vse-uro ... qlite.html
А данные можно получить только из курсора?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 04 сен 2013, 11:47

не понятнен вопрос. Если данные из таблиц, то да, метод query возвращает только курсор
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

snowkam
Сообщения: 162
Зарегистрирован: 21 мар 2013, 11:22

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

Сообщение snowkam » 05 сен 2013, 11:43

KamiSempai писал(а): Например так:[syntax=java]mAdapter.swapCursor(newCursor).close()[/syntax]
эх жалко только это можно применить начиная с API level 11 :(

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

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

Сообщение KamiSempai » 05 сен 2013, 12:23

snowkam писал(а):
KamiSempai писал(а): Например так:[syntax=java]mAdapter.swapCursor(newCursor).close()[/syntax]
эх жалко только это можно применить начиная с API level 11 :(
Для этого есть Support library.
В android.support.v4.widget.SimpleCursorAdapter его можно применять начиная с API level 4.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Владимир G
Сообщения: 20
Зарегистрирован: 18 сен 2013, 16:30

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

Сообщение Владимир G » 18 сен 2013, 16:34

подскажите почему в активити не находит R.layout.item ?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 18 сен 2013, 16:35

потому что, скорее всего, у тебя R не создался из-за ошибок в xml
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Владимир G
Сообщения: 20
Зарегистрирован: 18 сен 2013, 16:30

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

Сообщение Владимир G » 18 сен 2013, 17:05

Foenix писал(а):потому что, скорее всего, у тебя R не создался из-за ошибок в xml
нашел ошибку в menu\main.xml но как исправить не знаю
http://cs421723.vk.me/v421723070/77a4/uhWo6QNxbxU.jpg

Ответить