Урок 34. Хранение данных. SQLite
Re: Урок 34. Хранение данных. SQLite
я все писал заново . как в уроке, делая myDB - идут ошибки , делая mytable - ошибок нет и все работеат, тем более в
в классе : class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
// конструктор суперкласса
super(context, "myDB", null, 1);
Указывается версия и имя таблицы . в логах смотрел пишет что нет такой таблицы с название myDB . а переименовывая на mytable , все ок. это не я придумал. лично у меня так заработало.
}
в классе : class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
// конструктор суперкласса
super(context, "myDB", null, 1);
Указывается версия и имя таблицы . в логах смотрел пишет что нет такой таблицы с название myDB . а переименовывая на mytable , все ок. это не я придумал. лично у меня так заработало.
}
Re: Урок 34. Хранение данных. SQLite
Не путайте БД и таблицы.
В super(context, "myDB", null, 1); указывается не имя таблицы а имя БД, точнее имя файла БД.
В одной БД может содержаться несколько таблиц с данными. Имя создаваемой таблицы вы задаете при создании БД
db.execSQL("create table mytable...
В super(context, "myDB", null, 1); указывается не имя таблицы а имя БД, точнее имя файла БД.
В одной БД может содержаться несколько таблиц с данными. Имя создаваемой таблицы вы задаете при создании БД
db.execSQL("create table mytable...
Re: Урок 34. Хранение данных. SQLite
Зайдите в File Explorer найдите там папку
data/data/ru.startandroid.develop.p0341simpelsqlite/databases/ и вы увидите там два файла myDB и mytable
data/data/ru.startandroid.develop.p0341simpelsqlite/databases/ и вы увидите там два файла myDB и mytable
Re: Урок 34. Хранение данных. SQLite
ещё посоветую устанвоить sqlitestudio (на окна) и с помощу File Explore'ra вытягивать файл бд с эмулятора, потом средствами sqlitestudio просматривать содержимое бд. Бывает что доходит до таких ошибок: создали таблицу с одним именем а обращаемся с другим, и потом ломай голову где накосячил. А визуально то не видно что лежит в бд с эмулятора, вот в этом и помогает sqlitestudio.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
Спасибо большое ! А как правильно пользоваться sqlitestudio???
Re: Урок 34. Хранение данных. SQLite
там ничего сложного. Установили. Запустили. Добавили бд при помощи меню. Открыли бд и нужную таблицу двойным кликом, там дальше уже опционально-интуитивно всё понятно.Overdos писал(а):Спасибо большое ! А как правильно пользоваться sqlitestudio???
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
rezak90. Вы написал: "А вот гонять данные из активити в активити это одно из самых важных занятий, так что уделите этому внимание. Как перегнать сейчас подсказать не могу так как под рукой нету средств, но ничего сложного там нету."
Не сочтите, плз., за труд. Когда "появятся средства под рукой" - ткните меня носом: куда смотреть. Что-то я потерялся
Не сочтите, плз., за труд. Когда "появятся средства под рукой" - ткните меня носом: куда смотреть. Что-то я потерялся
Re: Урок 34. Хранение данных. SQLite
тьфу, был сегодня на работе и забыл о вас, дома Eclips хоть и есть, но я его не запускал уже пол года то и сомневаюсь что он вообще уже не работает. Завтра постараюсь подсказать.var49 писал(а):rezak90. Вы написал: "А вот гонять данные из активити в активити это одно из самых важных занятий, так что уделите этому внимание. Как перегнать сейчас подсказать не могу так как под рукой нету средств, но ничего сложного там нету."
Не сочтите, плз., за труд. Когда "появятся средства под рукой" - ткните меня носом: куда смотреть. Что-то я потерялся
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
rezak90. Спасибо. Я буду в надежде...
Re: Урок 34. Хранение данных. SQLite
та ёпт... напиши мне хотя бы в ЛС днём что бы наверняка уже, а то уже и самому как то стыдно.
Принцип такой: унаследовать интерфейс в классе SQLiteOpenHelper не получится, так что нужно реализовть некий контейнер в который запихнуть SQLiteOpenHelper и передавать этот контейнер в другую активность с полем SQLiteOpenHelper. Вот должно работать:
Принцип такой: унаследовать интерфейс в классе 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
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
Спасибо. Буду с этим разбираться. А стыдиться нечего: дело-то добровольное. Это я Вам признателен, что возитесь со мной...
Злоупотреблю
Сразу возник вопрос. Почему нельзя сделать как-так:
//в активити отправляем 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 у его текущей картинки. Это в принципе возможно?
Еще раз спасибо за обсуждение!
Злоупотреблю
Сразу возник вопрос. Почему нельзя сделать как-так:
//в активити отправляем 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
Да думаю велосипед))) первое сомнение у меня возникает так это как вы узнаёте какую запись нужно апдейтить при возврате в радительское активити? Второе так это зачем же таскать данные с активити в активити? да ещё и результат назад в радительское окно передавать?1. Есть впечатление, что я изобрел велосипед. А именно: есть EditActivity, куда я передаю редактируемую запись таблицы. В onCreate этой EditActivity я "распихиваю" поля записи по VIEW. А в обработчике кнопки "Сохранить изменения" я делаю обратную операцию: собираю измененную запись из VIEW в поля класса записи, чтобы передать назад в родительскую Activity. Таким образом, соответствие между полями записи и контролами (VIEW) задействуется 2 раза: 1 раз при приеме данных, а 2 раз - при возврате данных.
Мне, почему-то, кажется, что должен быть механизм (Adaptor), который принимает описание соответствия, а всю остальную работу делает сам. Но, пока, не соображу, как это сделать...
Моя мысль такая: в родительской активити вытянули _id записи которую нужно изменить и передаём в другое активити этот айди для редактирования. В новой активити выгружаем данные по этому айди и заполняем ими поля для редактирования. После нажатия на кнопку "сохранить изменения" будет произведена запись в бд по этому же айди. И всё, таскать уже обратно данные нет необходимости!
у ImageView есть метод getDrawable() который возвращает текущий Drawable который мы можем сравнить с теми что есть в /res/drawable2. Мне не удалось найти способ узнать у ImageView, какой R.Drawable у его текущей картинки. Это в принципе возможно?
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
Великий велосипед изобрели с БД.
КонтентПровайдер и Курсоры, вот стандартный способ.
КонтентПровайдер и Курсоры, вот стандартный способ.
Re: Урок 34. Хранение данных. SQLite
rezak90: "Моя мысль такая: в родительской активити вытянули _id записи которую нужно изменить и передаём в другое активити этот айди для редактирования. В новой активити выгружаем данные по этому айди и заполняем ими поля для редактирования. После нажатия на кнопку "сохранить изменения" будет произведена запись в бд по этому же айди. И всё, таскать уже обратно данные нет необходимости!"
Это, конечно, правильно. Но непринципиально. В числе полей записи, которую я передаю, есть и id, так что проблем нет. А если не передавать запись "наружу", то как родительское Activity узнает, что данные изменились и перерисует себя?
Что касается getDrawable(), то этот метод возвращает Drawable, а не int. Т.е. чтобы найти id этого объекта, мне нужно перебрать все Drawable, пока не найду нужный. Это - как-то криво! Хотелось бы непосредственно получить id рисунка, который показывает ImageView.
Это, конечно, правильно. Но непринципиально. В числе полей записи, которую я передаю, есть и id, так что проблем нет. А если не передавать запись "наружу", то как родительское Activity узнает, что данные изменились и перерисует себя?
Что касается getDrawable(), то этот метод возвращает Drawable, а не int. Т.е. чтобы найти id этого объекта, мне нужно перебрать все Drawable, пока не найду нужный. Это - как-то криво! Хотелось бы непосредственно получить id рисунка, который показывает ImageView.
Re: Урок 34. Хранение данных. SQLite
neoksi. Буду Вам признателен за небольшой пример. Как с помощью КонтентПровайдер-а отобразить запись курсора в полях Activity, и обновить запись в таблице (или в курсоре?) по результатам изменений в полях Activity, которые сделал Пользователь.
Спасибо!
Спасибо!
Re: Урок 34. Хранение данных. SQLite
var49
небольшим примером тут не обойтись, лучше всего перечитать статью http://startandroid.ru/uroki/vse-uroki- ... vider.html
небольшим примером тут не обойтись, лучше всего перечитать статью http://startandroid.ru/uroki/vse-uroki- ... vider.html
Re: Урок 34. Хранение данных. SQLite
конечно правильней с провайдером и курсором, но я так полагаю речь идёт о небольшом количестве данных. Если нужно изменить всего пару полей в таблице то думаю что юзать провайдер будет излишне.
а что на счёт этого:
а что на счёт этого:
вернуть родительскому активити результат выполнения метода update из SQLiteOpenHelper'a и если операция прошла успешно то сделать notifyDatasetChanged() адаптеру.А если не передавать запись "наружу", то как родительское Activity узнает, что данные изменились и перерисует себя?
конечно криво, но в ImageView я не увидел метода который бы возвращал id ресурса.Это - как-то криво! Хотелось бы непосредственно получить id рисунка, который показывает ImageView.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
Всем спасибо за обсуждение!
Re: Урок 34. Хранение данных. SQLite
var49 у ресурса есть такой метод как getIdentifier() который возвращает айди заданного ресурса.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
-
- Сообщения: 103
- Зарегистрирован: 10 сен 2012, 11:58
Re: Урок 34. Хранение данных. SQLite
Здравствуйте,
Поднапрягся, и осилил первый урок по БД, но возник следующий вопрос, как вызывать значения БД при загрузке onCreate и отображать, например, в product.add(new Product( ??? , R.drawable.unread)) из Урока 54. Нужно ли писать итерацию? Вопрос возник потому, что хочется отображать ранее сохраненные данные при каждой новой загрузке приложения.
Спасибо.
Поднапрягся, и осилил первый урок по БД, но возник следующий вопрос, как вызывать значения БД при загрузке onCreate и отображать, например, в product.add(new Product( ??? , R.drawable.unread)) из Урока 54. Нужно ли писать итерацию? Вопрос возник потому, что хочется отображать ранее сохраненные данные при каждой новой загрузке приложения.
Спасибо.