Страница 5 из 39

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

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

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



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




}

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

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

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

Добавлено: 11 сен 2012, 11:35
AndreyI
Зайдите в File Explorer найдите там папку
data/data/ru.startandroid.develop.p0341simpelsqlite/databases/ и вы увидите там два файла myDB и mytable

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

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

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

Добавлено: 11 сен 2012, 13:04
Overdos
Спасибо большое ! А как правильно пользоваться sqlitestudio???

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

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

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

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

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

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

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

Добавлено: 12 сен 2012, 20:12
var49
rezak90. Спасибо. Я буду в надежде... :)

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

Добавлено: 12 сен 2012, 21:23
rezak90
та ёпт... напиши мне хотя бы в ЛС днём что бы наверняка уже, а то уже и самому как то стыдно.

Принцип такой: унаследовать интерфейс в классе 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");

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

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

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

Сразу возник вопрос. Почему нельзя сделать как-так:
//в активити отправляем 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 у его текущей картинки. Это в принципе возможно?

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

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

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

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

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

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

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

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

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

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

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

Спасибо!

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

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

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

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

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

Добавлено: 13 сен 2012, 19:47
var49
Всем спасибо за обсуждение!

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

Добавлено: 14 сен 2012, 11:17
rezak90
var49 у ресурса есть такой метод как getIdentifier() который возвращает айди заданного ресурса.

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

Добавлено: 12 окт 2012, 23:09
dil_android
Здравствуйте,

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

Спасибо.