Данные в J2ME RecordStore не сохраняются между сеансами - PullRequest
2 голосов
/ 10 ноября 2009

Я создаю мобильное приложение с J2ME и обнаружил, что к данным, которые я записываю в RecordStore, можно получить доступ, пока программа еще работает, но она теряется после выхода и перезапуска. Не исключение, данные просто теряются.

ОБНОВЛЕНИЕ: Спасибо всем за ваши предложения. Я использую NetBeans в Windows 7. Я не уверен, что он использует версию WTK, которую я установил ранее, или другую версию, которую он установил где-то еще. Я проверил в своей папке WTK файлы, о которых писал Павел, но не смог их найти. Сейчас я тестирую функции, требующие сохранения на моем телефоне и во всем остальном в эмуляторе, но, конечно, было бы намного лучше иметь возможность протестировать все в эмуляторе.

private RecordStore recordStore = null;

public MyMIDlet() {
    readStuff(); // output: nothing found in recordStore :(
    saveStuff();
    readStuff(); // output: stuff
}

private void readStuff() {
    try {
        recordStore = RecordStore.openRecordStore(REC_STORE, true);
        int n = recordStore.getNumRecords();
        String stuff;

        if (n == 0) {
            stuff = "nothing found in recordStore :(";
        }
        else {
            stuff = new String(recordStore.getRecord(1));
        }

        System.out.println(stuff);
    }
    catch (Exception e) {
        System.out.println("Exception occured in readStuff: " + e.getMessage());
    }
    finally {
        if (recordStore != null) {
            try {
                recordStore.closeRecordStore();
            }
            catch (Exception e) {
                // ignore
            }
        }
    }
}

private void saveStuff() {
    try {
        recordStore = RecordStore.openRecordStore(REC_STORE, true);
        int n = recordStore.getNumRecords();
        byte[] stuff = "stuff".getBytes();
        recordStore.addRecord(stuff, 0, stuff.length);
    } catch (Exception e) {
        System.out.println("Exception occured in saveStuff: " + e.getMessage());
    } finally {
        if (recordStore != null) {
            try {
                recordStore.closeRecordStore();
            } catch (Exception e) {
                // ignore
            }
        }
    }
}

Ответы [ 7 ]

3 голосов
/ 10 ноября 2009

Если вы используете Sun WTK, он создает файл с именем «in.use» в своей папке «appdb»:

C:\WTK25\appdb\DefaultColorPhone\in.use

Если вы закроете свой эмулятор необычным способом (например, убьете процесс), он не удалит его, а при следующем запуске эмулятора создаст временную папку для хранения данных:

C:\WTK25\appdb\temp.DefaultColorPhone1

при запуске этого способа в консоли должно появиться сообщение: «Запуск с хранилищем root temp.DefaultColorPhone1».

Я исправляю это, включая в мой файл ".bat" строку для удаления файла "in.use" каждый раз, когда запускается эмулятор. Но вы должны быть осторожны при запуске нескольких эмуляторов одновременно.

2 голосов
/ 25 февраля 2012

Этот вопрос был давно, но я наткнулся на него, когда искал ответ на ту же проблему с эмулятором, но в моем случае это было при использовании Java ME 3 SDK. Вполне возможно, что решение, которое я нашел, также может решить эту проблему.

Использование:

emulator -Xdescriptor:/path/to/app.jad

будет в соответствии с документами : «Установите мидлет, запустите его и удалите его после его завершения».

Чтобы сохранить установку (и ее данные), вы должны использовать:

emulator -Xjam:install=<JAD-file-URL>

URL-адрес файла JAD может быть веб-адресом или «file: ///path/to/app.jad», если вы хотите выполнить установку из локальной файловой системы. Эта команда установки отобразит номер хранилища приложения, которое вы затем сможете использовать для запуска эмулятора и запуска ранее установленного приложения, набрав:

emulator -Xjam:run=<application-storage-number>

Дополнительные параметры командной строки см. В документах .

2 голосов
/ 04 апреля 2010

Я сам столкнулся с той же проблемой, однако обнаружил, что NetBeans или что-то еще удаляет развернутые программные файлы после выполнения. Эти файлы находятся в папке C: \ Documents and Settings \ MyUser \ javame-sdk \ 3.0 \ work \ 0 \ appdb, могут отличаться в Vista / Win7, и я предполагаю, что число в пути относится к эмулятору, который вы используете в данный момент. с помощью. В любом случае, в этой папке найдите что-нибудь с именем, похожим на ваш RecordStore. Например. "00000002_PSC_onfig.db", который является моим хранилищем записей конфигурации пакета с именем PSConfig. Копируя это, например, «Копия 00000002_PSC_onfig.db» не будет удалена. После очистки NetBeans просто скопируйте его обратно в исходное имя. В следующий раз, когда вы нажмете Run в NetBeans, ваше хранилище записей будет там. Это больно, но, по крайней мере, это дает вам возможность использовать эмулятор для отладки обработки RMS.

1 голос
/ 07 октября 2010

, чтобы решить проблему с хранилищем, вам нужно проверить опцию «Размер хранилища» в менеджере платформы netbeans. Зайдите в свойства проекта; перейти на платформу; управлять эмуляторами; выберите беспроводной набор инструментов Sun Java; зайдите в Инструменты и Расширения; открытые настройки; место хранения; опция размера хранилища ... установить размер.

это работает для меня

1 голос
/ 10 ноября 2009

Если вы используете Windows Vista, могут быть и почти есть проблемы с разрешениями. Я не уверен, как решить эту проблему, но вы можете проверить, что пользователь, который запускает эмулятор, имеет доступ для записи в хранилище эмулятора.

В appdb / $ phone / *. Db

1 голос
/ 10 ноября 2009

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

0 голосов
/ 19 апреля 2015

У меня возникла такая же проблема в Ubuntu Linux и при работе с WTK 2.5.2 и Netbeans 8.0.2. Позже я понял, что это было вызвано выключением моего ноутбука без закрытия эмулятора. Это также происходит, если вы запускаете второй эмулятор без выключения первого.

Мое решение основано на Лучшем ответе здесь, просто выключите все эмуляторы и удалите файл, расположенный в

~/j2mewtk/2.5.2/appdb/DefaultColorPhone

...