Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Flash_2oo9
3 / 3 / 7
Регистрация: 31.10.2012
Сообщений: 142
#1

Как организовать класс для работы с несколькими таблицами - Программирование Android

23.09.2014, 23:26. Просмотров 1231. Ответов 15
Метки нет (Все метки)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private class DbOpenHelper extends SQLiteOpenHelper{
 
        public DbOpenHelper(Context context, final String DB_NAME, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, DB_NAME, factory, version);
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
            final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + FIRST_TABLE_NAME + " ( _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + FIRST_WORD + " TEXT, " +
                    SECOND_WORD + " TEXT, " + CORRECT_FIRST_WORDS + " INTEGER, " + CORRECT_SECOND_WORDS + " INTEGER, " + FIRST_COMMENT + " TEXT, " + SECOND_COMMENT + " TEXT )";
            db.execSQL(CREATE_TABLE);
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            final String DROP_TABLE = "DROP TABLE IF EXISTS " + FIRST_TABLE_NAME ;
            db.execSQL(DROP_TABLE);
            onCreate(db);
        }
    }
Есть класс DbOpenHelper для работы с БД, все работает отлично. В другом классе создаю экземпляр данного и дальше работаю. Но вот возник вопрос, появилось вторая таблица в бд, а в onCreate() и onUpgrade() я работаю только с FIRST_TABLE_NAME. Как мне работать с другой таблицей?
Мне кажется создавать для каждой таблицы свой класс - плохой вариант. Ведь как я понимаю если данные методы пустые, то читать с бд можно, но писать в нее нельзя.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2014, 23:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как организовать класс для работы с несколькими таблицами (Программирование Android):

Как организовать еще одно место для обрабатывания процедур?
в mainActivity уж очень много обрабочиков событий. как проще обрести...

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

Создание класса для работы с несколькими таблицами БД
Добрый вечер форумчане. Помогите с такой как я думаю не большой(но у меня к...

Какой класс в qt nредназначен для работы с таблицами?
ребят, какой класс в qt nредназначен для работы с таблицами , что то я не могу...

Как правильно организовать отношение между таблицами(тематика: График работы сотрудника).
Добрый день! Народ есть такая проблема, с которой я изменяю жене, работе и...

Как организовать добавление в один класс элементов другого в ходе работы программы
есть 2 класса Страна и континент. Подскажите, как организовать добавление...

15
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
24.09.2014, 08:59 #2
Лучший ответ Сообщение было отмечено Flash_2oo9 как решение

Решение

Допишите сразу после инициализации первой таблицы, вторую.
1
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
24.09.2014, 09:44 #3
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private class DbOpenHelper extends SQLiteOpenHelper{
 
        public DbOpenHelper(Context context, final String DB_NAME, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, DB_NAME, factory, version);
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
            final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + FIRST_TABLE_NAME + " ( _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + FIRST_WORD + " TEXT, " +
                    SECOND_WORD + " TEXT, " + CORRECT_FIRST_WORDS + " INTEGER, " + CORRECT_SECOND_WORDS + " INTEGER, " + FIRST_COMMENT + " TEXT, " + SECOND_COMMENT + " TEXT )";
            db.execSQL(CREATE_TABLE);
 
        final String CREATE_SECOND_TABLE = "CREATE TABLE IF NOT EXISTS " + SECOND_TABLE_NAME + " ( _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + FIRST_WORD + " TEXT, " +
                    SECOND_WORD + " TEXT, " + CORRECT_FIRST_WORDS + " INTEGER, " + CORRECT_SECOND_WORDS + " INTEGER, " + FIRST_COMMENT + " TEXT, " + SECOND_COMMENT + " TEXT )";
            db.execSQL(CREATE_TABLE);
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            final String DROP_TABLE = "DROP TABLE IF EXISTS " + FIRST_TABLE_NAME ;
            db.execSQL(DROP_TABLE);
 
            final String DROP_TABLE = "DROP TABLE IF EXISTS " + SECOND_TABLE_NAME ;
            db.execSQL(DROP_TABLE);
            onCreate(db);
        }
    }
1
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
24.09.2014, 11:47 #4
Встречный вопрос: А можно так с двумя БАЗАМИ работать? В описании команд SQLite встречал что можно, но примеров на яве/андроид не встречал...
Иногда нужно сделать сводную выборку или перекинуть данные между таблицами разных баз одним запросом...
0
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
24.09.2014, 11:53 #5
если я не ошибаюсь, то в одном приложении ты можешь создать только одну базу. Чтобы работать с таблицами в базах других приложений, то тебе надо root
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
24.09.2014, 13:43 #6
Цитата Сообщение от DevExp Посмотреть сообщение
в базах других приложений
Речь не об этом! База - это файлик. При открытии базы он захватывается. Но один SQLiteOpenHelper "по учебнику" работает только с одним файликом. А у меня их несколько - для разных целей. Хочу брать данные из одной и другой и получать сводную таблицу...
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
24.09.2014, 15:34 #7
Цитата Сообщение от Tester64 Посмотреть сообщение
Хочу брать данные из одной и другой и получать сводную таблицу...
А если просто получить данные из первой, запомнить их, открыть вторую БД, получить данные из нее и сбросить оба результата в виртуальную таблицу?)
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
24.09.2014, 16:30 #8
Цитата Сообщение от Spelcrawler Посмотреть сообщение
А если просто получить данные из первой, запомнить их, открыть вторую БД, получить данные из нее и сбросить оба результата в виртуальную таблицу?
Предлагаете сделать выборку из первой базы размером в несколько тысяч записей(или миллионов), а потом поштучно добавить эти записи в виртуальную таблицу второй базы для работы... Идея была работь с двумя базами как с одной! А не только односторонняя выгрузка. В документации SQLite на сайте видел подобные инструкции, но не пробовал!
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
24.09.2014, 16:52 #9
Что-то даже не могу представить зачем вообще приложению две БД. Создайте лучше еще 100 таблиц в первой)
0
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
24.09.2014, 16:54 #10
ему левые sqlite бд файлы надо открывать
смотрелку хочет сделать похоже
0
dmitre
10 / 10 / 3
Регистрация: 02.11.2013
Сообщений: 53
24.09.2014, 16:59 #11
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Что-то даже не могу представить зачем вообще приложению две БД. Создайте лучше еще 100 таблиц в первой)
На самом деле лучше так сделать (для себя "разделить" такие-то таблицы относятся к такой "базе", а другие-то таблицы - к такой-то).
Либо, когда надо с одной базы переключиться в другую делать чтото типа DBName.close().
Смысл делать две базы?
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
25.09.2014, 08:07 #12
Цитата Сообщение от dmitre Посмотреть сообщение
Смысл делать две базы?
Что-бы иметь возможнось их разнести при желании. Или наоборот, вторую обновлять пакетом через сеть.

1) на устройстве работают 2 юзера - для каждого своя база. По желанию директора база юзера№2 переносится на другое устройство без потерь и сложностей - просто архивом через сеть. 3я база - это настройки обоих юзеров под ЭТО устройство.

2) Одна для настроек и пометок юзера, а вторая - справочник высылаемый сервером (лекарства больницы, сборники рецептов, поварская книга). Справочник большой, упаковывается и высылается целиком заменяя все старые данные. Высылать его в xml для дальнейшего импорта - долго.

Пока мне это не надо, но теоретически ВЗМОЖНА такая ситуация...
0
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
25.09.2014, 08:15 #13
Не пробовал не импортировать в базу из xml, а просто подгружать xml
Таким образом проблема с долгой загрузкой решится. Ведь твои базы только ты видишь юзерам всё равно лишь бы работало...

Добавлено через 1 минуту
а при передаче через сеть помещай xml в zip архив
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
25.09.2014, 10:06 #14
Цитата Сообщение от DevExp Посмотреть сообщение
подгружать xml
Это как? Особый метод отправить данные из xml в sqlite? Если база в несколько мегабайт все равно долго импорт будет происходить. Да и зачем? Сжимаются примерно одинаково. Но SQLite файл сразу готов для работы.

Допустим Вы хотите сделать СОВМЕСТНУЮ выборку - рецепт из одной базы (внешней), а "пожелания" из другой (юзерской). Результат в одну красивую таблицу-курсор для адаптера... А через неделю-месяц получате архив с более полной книгой рецептов, частично исправленную (сразу sqlite базой). И не нужена своя обработка для импорта "только новых" данных. Или ожидания 15-60 минут на полный экспорт изменений в "единую базу".

Если поискать, всегда можно придумать применение для подобной технологии... Пока альтернативой вижу только одновременное удержание двух баз, выборки в обоих и "слив их вместе" в виртуальную таблицу для быстрых запросов. Но это потребует очень много памяти.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
25.09.2014, 10:14 #15
А база рецептов где? Если на сервере, то можно выгружать только то что изменилось и добавлять в базу. А базу для пользователя тоже можно "отделить" написав пару методов для выборки всех данных и записи в тот же xml, и для считывания этих данных на другом устройстве что-то написать. Это конечно трудозатратнее, но и работать все будет быстрее.
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
25.09.2014, 20:17 #16
Цитата Сообщение от Spelcrawler Посмотреть сообщение
А база рецептов где? Если на сервере, то можно выгружать только то что изменилось и добавлять в базу. А базу для пользователя тоже можно "отделить" написав пару методов для выборки всех данных и записи в тот же xml, и для считывания этих данных на другом устройстве что-то написать. Это конечно трудозатратнее, но и работать все будет быстрее.
Я же вроде обьяснил! Есть (допустим) база рецептов. Заполняется операторами (шеф поворами) на сервере и выгружается в SQLite базу, готовую для подключения к андроиду. Иногда она непредсказуемо меняется (любая запись может быть исправлена на сервере). Твое устройство может быть с базой любой "старости". Твоя программа ее только читает для совместных курсоров с твоими личными пожеланиями (в холодильнике есть: морковка, петрушка и лед - получить возможные рецепты на этих компонентах). На любом моменте можно обновить базу рецептов с сервера скачав с нуля все 5-50 мегабайт с новой базой, а не только 250 новых записей и 3000 исправленых. ИМХО это иногда проще чем искать отличия и их поштучно добавлять в базу. Особенно если изменений слишком много. При больших изменениях скачивание займет 5 минут, а интеграция по одной займет 50 минут. Плюс методика хранения и поиска отличий в базе для выгрузки юзерам только их изменений.

ИМХО было бы проще подключить обновленный "спрвочник" рецептов (в виде 2й базы) после скачивания более новой версии без лишних телодвижений... И сделать что-то вроде Select * From base1.holodilnik, base2.rezept where base1.holodilnik.product_id=base2.rezept.product_id.

А еще я приводил пример с личными базами юзеров, Которые можно просто перекинуть файликами чем играться с выгрузкой личных записей из общей базы.
0
25.09.2014, 20:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2014, 20:17
Привет! Вот еще темы с решениями:

Как работать с несколькими связанными между собой таблицами?
Доброго время суток, форумчяни! Я вот пытаюсь разобраться как можно работать с...

Как создать базу данных в Sql с несколькими таблицами
Срочно нужно было сделать в sql свою бд,состоящую из трех-четырех...

Как обратиться к слайду (т.е. сделать активным следующий слайд для работы с таблицами на нём)?
Добрый день! Подскажите, пожалуйста, как обратиться к следующему слайду...

Как организовать связь между таблицами
Есть две таблицы и между ними нужно установить связь один ко многим. Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru