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

Обсуждение уроков
dlnsk
Сообщения: 9
Зарегистрирован: 13 авг 2012, 14:16

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

Сообщение dlnsk » 14 авг 2012, 10:48

Еще, по хорошему, нужно делать

Код: Выделить всё

c.close();
перед break для кнопки чтения данных, чтобы освободить ресурсы, иначе при выполнении сборки мусора возникает ошибка (правда она не критическая, так что на работу программы не влияет) которую видно в LogCat.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 14 авг 2012, 14:17

dlnsk писал(а):Еще, по хорошему, нужно делать

Код: Выделить всё

c.close();
перед break для кнопки чтения данных, чтобы освободить ресурсы, иначе при выполнении сборки мусора возникает ошибка (правда она не критическая, так что на работу программы не влияет) которую видно в LogCat.
Да, верно, спасибо! Пофиксю.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

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

Сообщение powercat » 24 авг 2012, 16:29

А как с помощью опенхелпера создать базу со своим путем? Есть каталог, в котором я и хочу создать файл базы. Как это реализовать?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 27 авг 2012, 13:49

powercat писал(а):А как с помощью опенхелпера создать базу со своим путем? Есть каталог, в котором я и хочу создать файл базы. Как это реализовать?
Посмотрите тут наработку - возможно, будет актуальна для вас : viewtopic.php?f=26&t=235
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

mmvds
Сообщения: 14
Зарегистрирован: 23 июл 2012, 18:31

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

Сообщение mmvds » 30 авг 2012, 14:58

Подскажите пожалуйста, как принято правильно переносить большой объем данных в приложение на андроид?
Например, у меня есть экселевский файл, в котором несколько тысяч строк, хочу перенести их в андроид приложение, чтобы всегда под рукой искать/добавлять нужную инфу. С андроидом пока знаком слабо, на основе того что изучил вижу следующие варианты:
1) Тупо копирнуть все данные в код приложения в метод когда база не создана, думаю этот вариант точно не правильный, т.к. размер кода увеличится на порядки :)
2) Сконвертировать xls в xml формат и доставать данные уже в приложении, вроде вариант возможный, но медленный
3) Вариант 2, но при первом запуске передать все в SQL чтобы медленным был только первый раз.
4) Заранее сделать готовый файл базы, который копировать в нужное место (не знаю как и куда) при первом запуске. Думаю это самый верный вариант

Наверняка кто-то уже сталкивался с такой проблемой?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 30 авг 2012, 15:19

Самый лучший вариант это 4.
Ссылка на то как это делать: http://idev.by/android/145/
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

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

Сообщение AndreyI » 30 авг 2012, 15:26

Ну если только под себя, то танцы с бубнами по помещению в assets и копированию её оттуда совсем не нужны (тем более что расходуется память на хранение двух экземпляров БД). Можно скопировать базу с компьютера в телефон на SD карту и работать с ней, тогда на телефоне будет только один файл с БД.

mmvds
Сообщения: 14
Зарегистрирован: 23 июл 2012, 18:31

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

Сообщение mmvds » 30 авг 2012, 15:42

Спасибо! А из assets я так понимаю удалить не реально? А если не под себя - можно же сделать загрузку свежей базы из инета на SD, а потом уже открывать?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 30 авг 2012, 15:54

Здесь был полнейший бред... Удалил от греха подальше.

Загрузка из интернета наверное самый предпочтительный вариант, но для него нужен сервер, на котором хранить информацию.
Последний раз редактировалось KamiSempai 30 авг 2012, 16:19, всего редактировалось 2 раза.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

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

Сообщение AndreyI » 30 авг 2012, 15:57

Из assets удалить невозможно, apk находится в защищенной области.
А так да, если распространять приложение, то в assets (не обязательно можно и в res/raw) либо грузить из Инета. Или прилагать файл БД к своему apk с инструкцией для пользователей как его устанавливать.

mmvds
Сообщения: 14
Зарегистрирован: 23 июл 2012, 18:31

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

Сообщение mmvds » 30 авг 2012, 16:17

KamiSempai, AndreyI
Спасибо! С сервером проблем нет, 500 руб в год хостинга всех делов, пока делаю как хобби для себя, но возможно потом выложу для народа, попробую все варианты

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

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

Сообщение var49 » 30 авг 2012, 20:35

Здравствуйте!

Я полагал, что метод onCreate() должен срабатывать при создании экземпляра объекта.
Я и сейчас так полагаю! :) Но, видимо, где-то протупил и не вижу...

Ниже код и соответствующий ЛОГ. Из ЛОГА видно, что при выполнении
mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);

Метод public void onCreate(SQLiteDatabase db) класса DBHelper не вызвался!?

Может кто-то из ГУРУ подскажет, где я не прав?

Вот код (практически полностью из урока):
package com.example.money01;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class MyMoneyDB {
private static final String LOG_TAG = "Money";
public static SQLiteDatabase MoneyDB;

private static final String DB_NAME = "myMoney";
private static final int DB_VERSION = 1;
private static final String ACC_CREATE =
"create table Acc (" +
" _ID integer primary key autoincrement, " +
" _TYPE integer, " +
" _CURR integer, " +
" _Name text, " +
" _SubName text, " +
" _SortOrder integer" +
");";

private final Context mCtx;
private DBHelper mDBHelper;

public MyMoneyDB(Context ctx) {
mCtx = ctx;
}

// открыть подключение
public void open() {
Log.d(LOG_TAG, "Будем создавать DBHelper.");
mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
Log.d(LOG_TAG, "Создали DBHelper.");
MoneyDB = mDBHelper.getWritableDatabase();
}

// закрыть подключение
public void close() {
if (mDBHelper!=null) mDBHelper.close();
}

// класс по созданию и управлению БД
private class DBHelper extends SQLiteOpenHelper {

public DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}

// создаем
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(LOG_TAG, "Будем создавать базу.");
db.execSQL(ACC_CREATE);

// Для примера наполняем всякой фигней
ContentValues cv = new ContentValues();
for (int i = 1; i < 5; i++) {
cv.put("_CURR", 0);
cv.put("_TYPE", i);
cv.put("_SubName", i);
cv.put("_SortOrder", 0);
cv.put("_Name", "Счет " + i);
db.insert("Acc", null, cv);
}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}

А вот, соответствующий ЛОГ

08-30 19:21:46.001: D/Money(640): Будем создавать DBHelper.
08-30 19:21:46.011: D/Money(640): Создали DBHelper.

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

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

Сообщение neoksi » 30 авг 2012, 20:48

var49 писал(а):Здравствуйте!

Я полагал, что метод onCreate() должен срабатывать при создании экземпляра объекта.
Я и сейчас так полагаю! :) Но, видимо, где-то протупил и не вижу...
Неа, вызывается метод с именем класса, а вот из него уже и вызывают нам привычный onCreate.

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

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

Сообщение var49 » 30 авг 2012, 21:01

Здравствуйте, neoksi!
Не совсем Вас понял :(
"Метод с именем класса" это - конструктор.? Конечно, он вызывается в первую очередь!
Но, все же, я ожидал, что между этими 2-мя записями в ЛОГ

08-30 19:21:46.001: D/Money(640): Будем создавать DBHelper.
08-30 19:21:46.011: D/Money(640): Создали DBHelper.

будет еще одна:
....... "Будем создавать базу."

Которая формируется в самом начале метода onCreate().
А этой записи нет! :( Значит onCreate() не вызвался.

ПОЧЕМУ???

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

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

Сообщение neoksi » 30 авг 2012, 21:30

var49 писал(а):Здравствуйте, neoksi!
...
Значит onCreate() не вызвался.

ПОЧЕМУ???
Так как конструктор Хелпера вызывает метод onCreate, когда БД отсутствует, а у вас она уже похоже создана и он максимум что вызовет это onUpgrade, если версия БД старая.

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

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

Сообщение var49 » 31 авг 2012, 18:33

Здравствуйте, neoksi!
Это - полезная идея! Я, правда, проверял наличие файлов *.db - их нет.
Немного погуглив я прочел, что найти БД можно изнутри Eclipse в окне FileExporer.
Но у меня это окно ПУСТОЕ. Вообще ничего не видно! И все кнопки этого окна "Disabled".
Это означает, что у меня "криво" стоит Eclipse? Или есть "волшебные" команды?
Как Вы думаете?

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

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

Сообщение var49 » 31 авг 2012, 19:01

Все. Допер. Все заработало. Вы был совершенно прав! БД уже была создана. А я допер, что FileExporer показывает фйаловую систему эмулятора, а не моего ПК. Тормоз!!!
Спасибо за обсужение!

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

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

Сообщение var49 » 08 сен 2012, 18:43

Уважаемые Гуру! Помогите разобраться. Все примеры, которые я видел по использованию БД в приложениях сводились к тому, что есть таблица, MainActivity с ListView на эту таблицу и EditActivity с формой редактирования записи. Для работы с таблицей создается класс, который включает в себя методы для работы с таблицей. И т.д.
При этом БД открывается в MainActivity, а данные в EditActivity передаются в Intent. Таким образом, EditActivity ничего про БД "не знает".
А я хочу в EditActivity положить lookup (например Spinner). Для его заполнения EditActivity должна обратиться к другой таблице БД. НО EditActivity уже открытую БД не видит! Неужели мне нужно в EditActivity заново открывать БД?
Скорее всего нет. Научите, как сделать, чтобы единожды открытая БД была доступна из всех Activity приложения.

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

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

Сообщение neoksi » 09 сен 2012, 07:47

var49,
смотрите в сторону ContentProvider. Создаете его и общаетесь с БД из любой части программы.

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

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

Сообщение var49 » 09 сен 2012, 08:35

Спасибо! Буду смотреть туда :)

Ответить