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

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

Добавлено: 09 сен 2012, 14:31
var49
Хм... Начал смотреть и сразу наткнулся на следующее:
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-а, чтобы он был "виден" из других классов.

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

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

Добавлено: 09 сен 2012, 14:40
rezak90
создай свой класс который унаследуется от DBHelper'a и юзай его где душа пожелает =)

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

Добавлено: 09 сен 2012, 21:12
neoksi
var49
В манифесте можно прописать, что доступ будет к нему иметь только твоё приложение.

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

Добавлено: 10 сен 2012, 10:16
Overdos
Привет ))
Подскажите что не так, делал все как в уроке(
Изображение

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

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

Добавлено: 10 сен 2012, 12:01
rezak90
Overdos и что можно понять с этого скриншота? Лог ошибок в студию!

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

Добавлено: 10 сен 2012, 18:06
var49
К вопросу об использовании единожды открытой БД во всех 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.
Ваше мнение?

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

Добавлено: 10 сен 2012, 18:23
var49
Прошу прощения. Несколько опечаток. В 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);

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

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

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

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




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

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

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

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

Добавлено: 10 сен 2012, 20:17
Overdos
Ребят мимо меня проходим ))

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

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

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

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

Добавлено: 10 сен 2012, 22:51
rezak90
var49 ресурсоёмкая была когда я ради теста считывал 100000 строк и заняло это дело порядка 40 секунд. Так что если у вас до 1000 записей то на производительность это не повлияет.
А вот гонять данные из активити в активити это одно из самых важных занятий, так что уделите этому внимание. Как перегнать сейчас подсказать не могу так как под рукой нету средств, но ничего сложного там нету.

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

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

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

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

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

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

Добавлено: 11 сен 2012, 09:27
rezak90
значит не всё, я тоже первый раз сделал как в уроке, а оказалась бональная вешь при создании бд использовал не ту переменную. Так что без вылаженного кода трудно что то сказать.

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

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

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

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

Добавлено: 11 сен 2012, 09:45
rezak90
ну вот как и говорилось, банальная ошибка =)

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

Добавлено: 11 сен 2012, 09:47
Overdos
Спасибо отдельное rezak90! хоть кто то пытается помочь =)

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

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