Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> База данных без RMS, Реализация БД без RMS. 
V
    Опции темы
Vitaly83
  Дата 15.7.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 25.9.2007

Репутация: нет
Всего: нет



Есть небольшая (но большая для J2ME) база данных. Она в 3 таблицах. Маленькая (9 записей), Средняя (до 250 записей) и Большая (около 13000 записей). Каждая таблица имеет id, текстовое описание (до 64 символов) и ссылку (1-много) на нижестоящую таблицу (кроме последней).
Для J2ME я привёл её к массиву следующего вида:
Код

public Struct1[] data = new Struct1[] {
   new Struct1(String, new Struct2[] {
      new Struct2(String, Struct3[] {
         new Struct3(int, String),
         //...
      }),
      //...
   }),
   //...
};

Заполнена 1/8 часть данных, а мне уже выдаётся сообщение о том, что код слишком длинный (code too large).
Почему без RMS?
1. Это просто список, выбранные пункты которого и сохраняются в RMS.
2. Медленно.
3. Это не перезаписываемые данные. Вбил один раз и всё.
4. Незачем забивать память телефона мусором (хотя и так получиться немало), но в указанном случае доступ к данным будет быстрее и проще.

Почему не через Net затягивать?
1. Программа должна быть максимально автономной.
2. Должна затягивать строго определённый набор данных (не более 3 КБ за операцию - опять же вопрос в скорости). Интерфейс простой, без графики, кроме нескольких маленьких рисунков, зашитых в программу.

Я не хочу использовать сторонние библиотеки. Нужен минимально-возможный размер программы.

В топиках о БД, многие решения завязаны на RMS, но, в данным случае, оно здесь не нужно.
PM MAIL   Вверх
math64
Дата 16.7.2009, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Если не нужно изменений (или изменений мало) - храни в файлах ресурсов внутри jar. Если есть изменения - храни в rms и/или сохраняй в сети.
PM   Вверх
Samuil
Дата 16.7.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

Репутация: 5
Всего: 6



Самый лучший вариант - хранить в сети. и скорость и размер будут соблюдаться. Вариант с хранением файлов тоже хорошь. НО! дохреновый размер будет у твоего джарика... А это критично для тебя.

Добавлено через 1 минуту и 8 секунд
Да и с массивами лучше не работать с таким количеством данных... В таком случае юзай вектор. она более гибкий.


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
math64
Дата 16.7.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Размер jar будет около 1-2 Mb. Я делал программу-словарь примерно такого размера.
Можно ещё хранить данные в jad и получать по getAppProperty() или во внешнем файле, тогда мидлет нужно подписывать или он будет каждый раз спрашивать разрешения на доступ.
Когда данные статические - Vector по сравнению с массивом ничего нового не даёт - только тратит больше памяти.
Но инициализировать большой Vector или массив прямо в коде слишком накладно.
PM   Вверх
Vitaly83
  Дата 16.7.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 25.9.2007

Репутация: нет
Всего: нет



Цитата(math64 @  16.7.2009,  07:25 Найти цитируемый пост)
Если не нужно изменений (или изменений мало) - храни в файлах ресурсов внутри jar. Если есть изменения - храни в rms и/или сохраняй в сети. 
Как это? Я просто не так давно этим начал заниматься.
Как я понимаю, это обычные файлы, только вшитые в программу или специальный формат?
Через что получить к ним доступ?

Я нашёл пример, но он использует внешние файлы, а, следовательно, будет запрашивать доступ каждый раз пр запуске.
FileConnection fc = (FileConnection)
Connector.open("file:///c:/text.txt",Connector.READ);
Мне нужно, чтобы пользователей не раздражали подобные вопросы.


Цитата(Samuil @  16.7.2009,  10:30 Найти цитируемый пост)
Да и с массивами лучше не работать с таким количеством данных... В таком случае юзай вектор. она более гибкий. 
Я выбрал массивы, а не вектор потому, что в массив гораздо проще загнать все данные в переменную используя лишь конструкторы, а для вектора нужно будет вызывать функцию каждый раз для добавления элемента.

PM MAIL   Вверх
W0LF
Дата 16.7.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



просто поместите файл в папку res, из нее ресурсы все, которые в ней, добавляются в корень джарика.
потом 
Код

InputStream in = getClass().getResourceAsStream("/nameOfTextFile.ForExampleTXT");

ну а дальше вычитываем все, что нам, а точнее Вам надо =)


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
math64
Дата 17.7.2009, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(Vitaly83 @  16.7.2009,  21:16 Найти цитируемый пост)
Я выбрал массивы, а не вектор потому, что в массив гораздо проще загнать все данные в переменную используя лишь конструкторы, а для вектора нужно будет вызывать функцию каждый раз для добавления элемента.

Помотри на байт-код который генерится при инициализации массива, он примерно такой:
Код

//int[] a = {1, 2, 3, 4, 5};
int[] a = new int[5];
int i = 0; a[i++] = 1; a[i++] = 2; a[i++] = 3; a[i++] = 4; a[i++] = 5;

Соотвенственно, когда инициализируешь большой массив, полученный байт-код будет слишком большой.
Можно читать примерно так:
Код

DataInputStream in = new DataInputStream(getClass().getResourceAsStream("/table1.dat"));
int length = in.readInt();
Struct1[] data = new Struct1[length];
for(int i = 0; i < length; i++) {
  data[i] = new Struct1();
  data[i].setId(in.readInt());
  data[i].setStr(in.readUTF());
}

Файл /table1.dat создаётся в DataOutputStream в обычной java, но можно использовать и обычный текстовый файл.
Данные третей таблицы лучше разбить на несколько файлов примерно по 100 - 256 записей.

Это сообщение отредактировал(а) math64 - 17.7.2009, 07:57
PM   Вверх
Vitaly83
  Дата 17.7.2009, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 25.9.2007

Репутация: нет
Всего: нет



Спасибо Вам всем!!!
То, что нужно.
Я решил выгружать данные в формате csv, а дальше, как говорится, "дело техники".
Скорее всего , большую таблицу (да, возможно, и среднюю тоже) разобью на несколько файлов - так чтение будет быстрее, да и памяти будет сжирать мало.

Это сообщение отредактировал(а) Vitaly83 - 17.7.2009, 23:21
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.