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

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

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

Сообщение var49 » 09 сен 2012, 14:31

Хм... Начал смотреть и сразу наткнулся на следующее:
A content provider is only required if you need to share data between multiple applications. For example, the contacts data is used by multiple applications and must be stored in a content provider. If you don't need to share data amongst multiple applications you can use a database directly via SQLiteDatabase.

Я, как раз, НЕ хочу юзать данные РАЗНЫМИ приложениями. Я хочу иметь данные только для СВОЕГО приложения, но не открывать базу каждый раз, как данные понадобятся в новом Activity.

Думаю, что я просто основательно подзабыл ООП. Вопрос в том, где и как создать экземпляр DBHelper-а, чтобы он был "виден" из других классов.

Продолжаю искать. Буду признателен за любые советы...

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

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

Сообщение rezak90 » 09 сен 2012, 14:40

создай свой класс который унаследуется от DBHelper'a и юзай его где душа пожелает =)
R.id.team
Политика на форуме запрещена

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

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

Сообщение neoksi » 09 сен 2012, 21:12

var49
В манифесте можно прописать, что доступ будет к нему иметь только твоё приложение.

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

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

Сообщение Overdos » 10 сен 2012, 10:16

Привет ))
Подскажите что не так, делал все как в уроке(
Изображение

ошибка при просмотре таблицы.

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

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

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

Overdos и что можно понять с этого скриншота? Лог ошибок в студию!
R.id.team
Политика на форуме запрещена

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

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

Сообщение var49 » 10 сен 2012, 18:06

К вопросу об использовании единожды открытой БД во всех Activity приложения.
Нашел следующее решение. Пока работает, но, поскольку я новичок, прошу экспертного мнения.
1. Перекрывается класс Application. Регистрируется в манифесте. В этом классе объявляется
public MyDBHelper db;
2. В методе onCreate этого класса делается
dbh = new MyDBHelper (this);
dbh.open();
3. В методе onTerminate
db.close();
4. В любом Activity, где нужно делать запрос к БД,
db = AppMy.getInstance().dbh;
и это и есть требуемый указатель на открытую БД. Можно делать
Cursor At = db.MyDB.query("Table", new String[] { "_Name" },
"_TYPE=" + t_id, null, null, null, null);
и т.п.

Немного смущает, что я нигде не делал .setGlobalStateValue, а прямо объявил нужные переменные в классе Application.
Ваше мнение?

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

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

Сообщение var49 » 10 сен 2012, 18:23

Прошу прощения. Несколько опечаток. В 2-х местах вместо db следует читать dbh. Исправляю...
public MyDBHelper dbh;
2. В методе onCreate этого класса делается
dbh = new MyDBHelper (this);
dbh.open();
3. В методе onTerminate
dbh.close();
4. В любом Activity, где нужно делать запрос к БД,
db = AppMy.getInstance().dbh;
и это и есть требуемый указатель на открытую БД. Можно делать
Cursor At = db.MyDB.query("Table", new String[] { "_Name" },"_TYPE=" + t_id, null, null, null, null);

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

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

Сообщение rezak90 » 10 сен 2012, 18:58

var49 а к чему всё таки такое стремление открыть бд только один раз? просто интересно чем это обосновано.
Ну и на первый взгляд что то способ выглядит как велосипед. Почему бы просто не гонять из активити в активити dbh и всё. Или же сделать по ленивому - объявить dbh как public static.
R.id.team
Политика на форуме запрещена

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

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

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

rezak90 , Я понимаю ты крутой ))) вот ошибки:
Изображение
Это при создании контакта!




А Вот при просмотре таблицы:
Изображение

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

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

Сообщение neoksi » 10 сен 2012, 20:06

rezak90 писал(а):var49 а к чему всё таки такое стремление открыть бд только один раз? просто интересно чем это обосновано.
Ну и на первый взгляд что то способ выглядит как велосипед. Почему бы просто не гонять из активити в активити dbh и всё. Или же сделать по ленивому - объявить dbh как public static.
rezak90
Это стремление складывается из-за особенностей SQLite, эта БД не поддерживает одновременное открытие сразу в нескольких местах одной БД.

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

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

Сообщение Overdos » 10 сен 2012, 20:17

Ребят мимо меня проходим ))

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

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

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

rezak90. Я бы и рад гонять dbh из Activity в Activity, только как это сделать? Я пробовал добавить dbh в Intent: не получилось :(
А как по-другому?
Что касается объявить dbh как public static. Запутался уже: это - первое, что приходило в голову; а вот почему не получилось уже не помню... Вероятно я плохо понимаю, что такое static (ООП пользовал давно, еще на Delphi).

А стремление открыть БД один раз от того, что как я понимаю, операция открытия БД довольно ресурсоемкая и не хочется ее многократно осуществлять.

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

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

Сообщение rezak90 » 10 сен 2012, 22:51

var49 ресурсоёмкая была когда я ради теста считывал 100000 строк и заняло это дело порядка 40 секунд. Так что если у вас до 1000 записей то на производительность это не повлияет.
А вот гонять данные из активити в активити это одно из самых важных занятий, так что уделите этому внимание. Как перегнать сейчас подсказать не могу так как под рукой нету средств, но ничего сложного там нету.
R.id.team
Политика на форуме запрещена

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

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

Сообщение rezak90 » 10 сен 2012, 22:59

Overdos я далеко не крут, просто не обладаю экстрасенсорными способностями и не могу дать ответ из не чётко заданного вопроса. Опять таки скрины мелкие а увеличить нельзя так как ссылка идёт на главную страницу радикала. Но ошибки стандартные как и у всех.
На первом скрине идёт еррор при попытки вставить данные в таблицу (а вот почему скрин маловат но могу предположить что дальше там идёт что то вроде этого SQLiteException: no such table ...) соответственно такой таблицы не существует или же она есть и вы не правильно указываете (или вообще не указываете) её.
Второй скрин показывает что вы пытаетесь вытянуть все данные с таблицы но sqlite опять таки выбрасывает SQLiteException: no such table . Почему? читать выше.
Так что кидайте код (хотя бы тот в котором идёт работа с бд, но дабы не делать ещё 10 постов лучше весь) и будем разбираться что да почему.
R.id.team
Политика на форуме запрещена

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

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

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

Вообщем-то ошибка в том что приложение не может создать БД. в моих лога нет пункта: --- onCreate database ---

а сразу появляется :--- Insert in mytable: --- и потом row inserted, ID = -1 ! скажите как сделать что бы создавалась БД, ведь делаю все как в уроке!что за дела???????

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

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

Сообщение rezak90 » 11 сен 2012, 09:27

значит не всё, я тоже первый раз сделал как в уроке, а оказалась бональная вешь при создании бд использовал не ту переменную. Так что без вылаженного кода трудно что то сказать.
R.id.team
Политика на форуме запрещена

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

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

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

Сори за много сообщений! ошибку нашел! все работает, вот где была ошибка в опечатке у автора:
Изображение

обведенное в красном круге исправил на : mytable. все работает .

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

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

Сообщение rezak90 » 11 сен 2012, 09:45

ну вот как и говорилось, банальная ошибка =)
R.id.team
Политика на форуме запрещена

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

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

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

Спасибо отдельное rezak90! хоть кто то пытается помочь =)

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

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

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

Нет там никаких ошибок, onCreate вызывается только если файла БД с таким именем не существует, просто у Overdos БД с именем "myDB" создалась в одном из первых запусков примера, но в логах по какой-то причине либо не отобразилось, либо осталось не замеченным.
Вы просто создали новую БД с именем "mytable", теперь все последующие запуски программы также не будут вызывать onCreate, до тех пор пока вы не удалите файл БД.

Ответить