Урок 34. Хранение данных. SQLite
Re: Урок 34. Хранение данных. SQLite
Хм... Начал смотреть и сразу наткнулся на следующее:
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-а, чтобы он был "виден" из других классов.
Продолжаю искать. Буду признателен за любые советы...
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
создай свой класс который унаследуется от DBHelper'a и юзай его где душа пожелает =)
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
var49
В манифесте можно прописать, что доступ будет к нему иметь только твоё приложение.
В манифесте можно прописать, что доступ будет к нему иметь только твоё приложение.
Re: Урок 34. Хранение данных. SQLite
Overdos и что можно понять с этого скриншота? Лог ошибок в студию!
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
К вопросу об использовании единожды открытой БД во всех 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.
Ваше мнение?
Нашел следующее решение. Пока работает, но, поскольку я новичок, прошу экспертного мнения.
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
Прошу прощения. Несколько опечаток. В 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);
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
var49 а к чему всё таки такое стремление открыть бд только один раз? просто интересно чем это обосновано.
Ну и на первый взгляд что то способ выглядит как велосипед. Почему бы просто не гонять из активити в активити dbh и всё. Или же сделать по ленивому - объявить dbh как public static.
Ну и на первый взгляд что то способ выглядит как велосипед. Почему бы просто не гонять из активити в активити dbh и всё. Или же сделать по ленивому - объявить dbh как public static.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
rezak90rezak90 писал(а):var49 а к чему всё таки такое стремление открыть бд только один раз? просто интересно чем это обосновано.
Ну и на первый взгляд что то способ выглядит как велосипед. Почему бы просто не гонять из активити в активити dbh и всё. Или же сделать по ленивому - объявить dbh как public static.
Это стремление складывается из-за особенностей SQLite, эта БД не поддерживает одновременное открытие сразу в нескольких местах одной БД.
Re: Урок 34. Хранение данных. SQLite
Ребят мимо меня проходим ))
Re: Урок 34. Хранение данных. SQLite
rezak90. Я бы и рад гонять dbh из Activity в Activity, только как это сделать? Я пробовал добавить dbh в Intent: не получилось
А как по-другому?
Что касается объявить dbh как public static. Запутался уже: это - первое, что приходило в голову; а вот почему не получилось уже не помню... Вероятно я плохо понимаю, что такое static (ООП пользовал давно, еще на Delphi).
А стремление открыть БД один раз от того, что как я понимаю, операция открытия БД довольно ресурсоемкая и не хочется ее многократно осуществлять.
А как по-другому?
Что касается объявить dbh как public static. Запутался уже: это - первое, что приходило в голову; а вот почему не получилось уже не помню... Вероятно я плохо понимаю, что такое static (ООП пользовал давно, еще на Delphi).
А стремление открыть БД один раз от того, что как я понимаю, операция открытия БД довольно ресурсоемкая и не хочется ее многократно осуществлять.
Re: Урок 34. Хранение данных. SQLite
var49 ресурсоёмкая была когда я ради теста считывал 100000 строк и заняло это дело порядка 40 секунд. Так что если у вас до 1000 записей то на производительность это не повлияет.
А вот гонять данные из активити в активити это одно из самых важных занятий, так что уделите этому внимание. Как перегнать сейчас подсказать не могу так как под рукой нету средств, но ничего сложного там нету.
А вот гонять данные из активити в активити это одно из самых важных занятий, так что уделите этому внимание. Как перегнать сейчас подсказать не могу так как под рукой нету средств, но ничего сложного там нету.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
Overdos я далеко не крут, просто не обладаю экстрасенсорными способностями и не могу дать ответ из не чётко заданного вопроса. Опять таки скрины мелкие а увеличить нельзя так как ссылка идёт на главную страницу радикала. Но ошибки стандартные как и у всех.
На первом скрине идёт еррор при попытки вставить данные в таблицу (а вот почему скрин маловат но могу предположить что дальше там идёт что то вроде этого SQLiteException: no such table ...) соответственно такой таблицы не существует или же она есть и вы не правильно указываете (или вообще не указываете) её.
Второй скрин показывает что вы пытаетесь вытянуть все данные с таблицы но sqlite опять таки выбрасывает SQLiteException: no such table . Почему? читать выше.
Так что кидайте код (хотя бы тот в котором идёт работа с бд, но дабы не делать ещё 10 постов лучше весь) и будем разбираться что да почему.
На первом скрине идёт еррор при попытки вставить данные в таблицу (а вот почему скрин маловат но могу предположить что дальше там идёт что то вроде этого SQLiteException: no such table ...) соответственно такой таблицы не существует или же она есть и вы не правильно указываете (или вообще не указываете) её.
Второй скрин показывает что вы пытаетесь вытянуть все данные с таблицы но sqlite опять таки выбрасывает SQLiteException: no such table . Почему? читать выше.
Так что кидайте код (хотя бы тот в котором идёт работа с бд, но дабы не делать ещё 10 постов лучше весь) и будем разбираться что да почему.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
Вообщем-то ошибка в том что приложение не может создать БД. в моих лога нет пункта: --- onCreate database ---
а сразу появляется :--- Insert in mytable: --- и потом row inserted, ID = -1 ! скажите как сделать что бы создавалась БД, ведь делаю все как в уроке!что за дела???????
а сразу появляется :--- Insert in mytable: --- и потом row inserted, ID = -1 ! скажите как сделать что бы создавалась БД, ведь делаю все как в уроке!что за дела???????
Re: Урок 34. Хранение данных. SQLite
значит не всё, я тоже первый раз сделал как в уроке, а оказалась бональная вешь при создании бд использовал не ту переменную. Так что без вылаженного кода трудно что то сказать.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
ну вот как и говорилось, банальная ошибка =)
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 34. Хранение данных. SQLite
Спасибо отдельное rezak90! хоть кто то пытается помочь =)
Re: Урок 34. Хранение данных. SQLite
Нет там никаких ошибок, onCreate вызывается только если файла БД с таким именем не существует, просто у Overdos БД с именем "myDB" создалась в одном из первых запусков примера, но в логах по какой-то причине либо не отобразилось, либо осталось не замеченным.
Вы просто создали новую БД с именем "mytable", теперь все последующие запуски программы также не будут вызывать onCreate, до тех пор пока вы не удалите файл БД.
Вы просто создали новую БД с именем "mytable", теперь все последующие запуски программы также не будут вызывать onCreate, до тех пор пока вы не удалите файл БД.