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

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

Добавлено: 14 авг 2012, 10:48
dlnsk
Еще, по хорошему, нужно делать

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

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

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

Добавлено: 14 авг 2012, 14:17
damager82
dlnsk писал(а):Еще, по хорошему, нужно делать

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

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

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

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

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

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

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

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

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

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

Добавлено: 30 авг 2012, 15:19
KamiSempai
Самый лучший вариант это 4.
Ссылка на то как это делать: http://idev.by/android/145/

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

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

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

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

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

Добавлено: 30 авг 2012, 15:54
KamiSempai
Здесь был полнейший бред... Удалил от греха подальше.

Загрузка из интернета наверное самый предпочтительный вариант, но для него нужен сервер, на котором хранить информацию.

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

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

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

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

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

Добавлено: 30 авг 2012, 20:35
var49
Здравствуйте!

Я полагал, что метод 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.

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

Добавлено: 30 авг 2012, 20:48
neoksi
var49 писал(а):Здравствуйте!

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

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

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

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

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

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

ПОЧЕМУ???

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

Добавлено: 30 авг 2012, 21:30
neoksi
var49 писал(а):Здравствуйте, neoksi!
...
Значит onCreate() не вызвался.

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

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

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

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

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

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

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

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

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

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

Добавлено: 09 сен 2012, 08:35
var49
Спасибо! Буду смотреть туда :)