Урок 34. Хранение данных. SQLite

Обсуждение уроков
Overdos
Сообщения: 33
Зарегистрирован: 09 авг 2012, 20:58
Откуда: Краснодар

Re: Урок 34. Хранение данных. SQLite

Сообщение Overdos » 11 сен 2012, 11:19

я все писал заново . как в уроке, делая myDB - идут ошибки , делая mytable - ошибок нет и все работеат, тем более в
в классе : class DBHelper extends SQLiteOpenHelper {

public DBHelper(Context context) {
// конструктор суперкласса
super(context, "myDB", null, 1);



Указывается версия и имя таблицы . в логах смотрел пишет что нет такой таблицы с название myDB . а переименовывая на mytable , все ок. это не я придумал. лично у меня так заработало.




}

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 34. Хранение данных. SQLite

Сообщение AndreyI » 11 сен 2012, 11:32

Не путайте БД и таблицы.
В super(context, "myDB", null, 1); указывается не имя таблицы а имя БД, точнее имя файла БД.
В одной БД может содержаться несколько таблиц с данными. Имя создаваемой таблицы вы задаете при создании БД
db.execSQL("create table mytable...

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 34. Хранение данных. SQLite

Сообщение AndreyI » 11 сен 2012, 11:35

Зайдите в File Explorer найдите там папку
data/data/ru.startandroid.develop.p0341simpelsqlite/databases/ и вы увидите там два файла myDB и mytable

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 11 сен 2012, 12:01

ещё посоветую устанвоить sqlitestudio (на окна) и с помощу File Explore'ra вытягивать файл бд с эмулятора, потом средствами sqlitestudio просматривать содержимое бд. Бывает что доходит до таких ошибок: создали таблицу с одним именем а обращаемся с другим, и потом ломай голову где накосячил. А визуально то не видно что лежит в бд с эмулятора, вот в этом и помогает sqlitestudio.
R.id.team
Политика на форуме запрещена

Overdos
Сообщения: 33
Зарегистрирован: 09 авг 2012, 20:58
Откуда: Краснодар

Re: Урок 34. Хранение данных. SQLite

Сообщение Overdos » 11 сен 2012, 13:04

Спасибо большое ! А как правильно пользоваться sqlitestudio???

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 11 сен 2012, 13:19

Overdos писал(а):Спасибо большое ! А как правильно пользоваться sqlitestudio???
там ничего сложного. Установили. Запустили. Добавили бд при помощи меню. Открыли бд и нужную таблицу двойным кликом, там дальше уже опционально-интуитивно всё понятно.
R.id.team
Политика на форуме запрещена

var49
Сообщения: 24
Зарегистрирован: 25 авг 2012, 09:13

Re: Урок 34. Хранение данных. SQLite

Сообщение var49 » 11 сен 2012, 20:56

rezak90. Вы написал: "А вот гонять данные из активити в активити это одно из самых важных занятий, так что уделите этому внимание. Как перегнать сейчас подсказать не могу так как под рукой нету средств, но ничего сложного там нету."
Не сочтите, плз., за труд. Когда "появятся средства под рукой" - ткните меня носом: куда смотреть. Что-то я потерялся :(

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 11 сен 2012, 22:52

var49 писал(а):rezak90. Вы написал: "А вот гонять данные из активити в активити это одно из самых важных занятий, так что уделите этому внимание. Как перегнать сейчас подсказать не могу так как под рукой нету средств, но ничего сложного там нету."
Не сочтите, плз., за труд. Когда "появятся средства под рукой" - ткните меня носом: куда смотреть. Что-то я потерялся :(
тьфу, был сегодня на работе и забыл о вас, дома Eclips хоть и есть, но я его не запускал уже пол года то и сомневаюсь что он вообще уже не работает. Завтра постараюсь подсказать.
R.id.team
Политика на форуме запрещена

var49
Сообщения: 24
Зарегистрирован: 25 авг 2012, 09:13

Re: Урок 34. Хранение данных. SQLite

Сообщение var49 » 12 сен 2012, 20:12

rezak90. Спасибо. Я буду в надежде... :)

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 12 сен 2012, 21:23

та ёпт... напиши мне хотя бы в ЛС днём что бы наверняка уже, а то уже и самому как то стыдно.

Принцип такой: унаследовать интерфейс в классе SQLiteOpenHelper не получится, так что нужно реализовть некий контейнер в который запихнуть SQLiteOpenHelper и передавать этот контейнер в другую активность с полем SQLiteOpenHelper. Вот должно работать:

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

public class Container implements Parcelable {
	private SQLiteOpenHelper dbh;
	public Container(SQLiteOpenHelper _dbh) {
		dbh = _dbh;
	}
	private Container(Parcel parcel) {
		dbh = (SQLiteOpenHelper)parcel.readValue(SQLiteOpenHelper.class.getClassLoader());
	}
	public void writeToParcel(Parcel parcel, int flags) {
		parcel.writeValue(dbh);
	}
	public static final Parcelable.Creator<Container> CREATOR = new Parcelable.Creator<Container>() {
	    public Container createFromParcel(Parcel in) {
	      return new Container(in);
	    }

	    public Container[] newArray(int size) {
	      return new Container[size];
	    }
	};
	public int describeContents() {
		return 0;
	}
	
}
//в активити отправляем intent.putExtra("name", new Container(dbh));
//в активити принимаем SQLiteOpenHelper dbh = (SQLiteOpenHelper)getIntent().getParcelableExtra("name");
R.id.team
Политика на форуме запрещена

var49
Сообщения: 24
Зарегистрирован: 25 авг 2012, 09:13

Re: Урок 34. Хранение данных. SQLite

Сообщение var49 » 13 сен 2012, 17:16

Спасибо. Буду с этим разбираться. А стыдиться нечего: дело-то добровольное. Это я Вам признателен, что возитесь со мной...

Злоупотреблю :)

Сразу возник вопрос. Почему нельзя сделать как-так:
//в активити отправляем intent.putExtra("name", dbh);
//в активити принимаем SQLiteOpenHelper dbh = (SQLiteOpenHelper)getIntent().getExtra("name");

Если, как я привык раньше, dbh это указатель на экземпляр созданного класса SQLiteOpenHelper, то почему этот указатель нельзя передать, как обычное число? А ведь нельзя! Я проверял. Что-то здесь я неправильно понимаю.... :(

Я, в общем-то, заставил приложение работать так, как хочется. Но есть 2 вопроса.

1. Есть впечатление, что я изобрел велосипед. А именно: есть EditActivity, куда я передаю редактируемую запись таблицы. В onCreate этой EditActivity я "распихиваю" поля записи по VIEW. А в обработчике кнопки "Сохранить изменения" я делаю обратную операцию: собираю измененную запись из VIEW в поля класса записи, чтобы передать назад в родительскую Activity. Таким образом, соответствие между полями записи и контролами (VIEW) задействуется 2 раза: 1 раз при приеме данных, а 2 раз - при возврате данных.
Мне, почему-то, кажется, что должен быть механизм (Adaptor), который принимает описание соответствия, а всю остальную работу делает сам. Но, пока, не соображу, как это сделать...

2. Мне не удалось найти способ узнать у ImageView, какой R.Drawable у его текущей картинки. Это в принципе возможно?

Еще раз спасибо за обсуждение!

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 13 сен 2012, 17:42

1. Есть впечатление, что я изобрел велосипед. А именно: есть EditActivity, куда я передаю редактируемую запись таблицы. В onCreate этой EditActivity я "распихиваю" поля записи по VIEW. А в обработчике кнопки "Сохранить изменения" я делаю обратную операцию: собираю измененную запись из VIEW в поля класса записи, чтобы передать назад в родительскую Activity. Таким образом, соответствие между полями записи и контролами (VIEW) задействуется 2 раза: 1 раз при приеме данных, а 2 раз - при возврате данных.
Мне, почему-то, кажется, что должен быть механизм (Adaptor), который принимает описание соответствия, а всю остальную работу делает сам. Но, пока, не соображу, как это сделать...
Да думаю велосипед))) первое сомнение у меня возникает так это как вы узнаёте какую запись нужно апдейтить при возврате в радительское активити? Второе так это зачем же таскать данные с активити в активити? да ещё и результат назад в радительское окно передавать?
Моя мысль такая: в родительской активити вытянули _id записи которую нужно изменить и передаём в другое активити этот айди для редактирования. В новой активити выгружаем данные по этому айди и заполняем ими поля для редактирования. После нажатия на кнопку "сохранить изменения" будет произведена запись в бд по этому же айди. И всё, таскать уже обратно данные нет необходимости!
2. Мне не удалось найти способ узнать у ImageView, какой R.Drawable у его текущей картинки. Это в принципе возможно?
у ImageView есть метод getDrawable() который возвращает текущий Drawable который мы можем сравнить с теми что есть в /res/drawable
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение neoksi » 13 сен 2012, 17:49

Великий велосипед изобрели с БД.
КонтентПровайдер и Курсоры, вот стандартный способ.

var49
Сообщения: 24
Зарегистрирован: 25 авг 2012, 09:13

Re: Урок 34. Хранение данных. SQLite

Сообщение var49 » 13 сен 2012, 18:25

rezak90: "Моя мысль такая: в родительской активити вытянули _id записи которую нужно изменить и передаём в другое активити этот айди для редактирования. В новой активити выгружаем данные по этому айди и заполняем ими поля для редактирования. После нажатия на кнопку "сохранить изменения" будет произведена запись в бд по этому же айди. И всё, таскать уже обратно данные нет необходимости!"

Это, конечно, правильно. Но непринципиально. В числе полей записи, которую я передаю, есть и id, так что проблем нет. А если не передавать запись "наружу", то как родительское Activity узнает, что данные изменились и перерисует себя?

Что касается getDrawable(), то этот метод возвращает Drawable, а не int. Т.е. чтобы найти id этого объекта, мне нужно перебрать все Drawable, пока не найду нужный. Это - как-то криво! Хотелось бы непосредственно получить id рисунка, который показывает ImageView.

var49
Сообщения: 24
Зарегистрирован: 25 авг 2012, 09:13

Re: Урок 34. Хранение данных. SQLite

Сообщение var49 » 13 сен 2012, 18:33

neoksi. Буду Вам признателен за небольшой пример. Как с помощью КонтентПровайдер-а отобразить запись курсора в полях Activity, и обновить запись в таблице (или в курсоре?) по результатам изменений в полях Activity, которые сделал Пользователь.

Спасибо!

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение neoksi » 13 сен 2012, 18:47

var49
небольшим примером тут не обойтись, лучше всего перечитать статью http://startandroid.ru/uroki/vse-uroki- ... vider.html

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 13 сен 2012, 19:19

конечно правильней с провайдером и курсором, но я так полагаю речь идёт о небольшом количестве данных. Если нужно изменить всего пару полей в таблице то думаю что юзать провайдер будет излишне.
а что на счёт этого:
А если не передавать запись "наружу", то как родительское Activity узнает, что данные изменились и перерисует себя?
вернуть родительскому активити результат выполнения метода update из SQLiteOpenHelper'a и если операция прошла успешно то сделать notifyDatasetChanged() адаптеру.
Это - как-то криво! Хотелось бы непосредственно получить id рисунка, который показывает ImageView.
конечно криво, но в ImageView я не увидел метода который бы возвращал id ресурса.
R.id.team
Политика на форуме запрещена

var49
Сообщения: 24
Зарегистрирован: 25 авг 2012, 09:13

Re: Урок 34. Хранение данных. SQLite

Сообщение var49 » 13 сен 2012, 19:47

Всем спасибо за обсуждение!

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 14 сен 2012, 11:17

var49 у ресурса есть такой метод как getIdentifier() который возвращает айди заданного ресурса.
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 12 окт 2012, 23:09

Здравствуйте,

Поднапрягся, и осилил первый урок по БД, но возник следующий вопрос, как вызывать значения БД при загрузке onCreate и отображать, например, в product.add(new Product( ??? , R.drawable.unread)) из Урока 54. Нужно ли писать итерацию? Вопрос возник потому, что хочется отображать ранее сохраненные данные при каждой новой загрузке приложения.

Спасибо.

Ответить