Данные в J2ME RecordStore не сохраняются между сеансами

Я создаю мобильное приложение с 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
            }
        }
    }
}

person neo2862    schedule 09.11.2009    source источник
comment
Это работает на физическом телефоне или на эмуляторе? Сохраняются ли данные между сеансами эмулятора, может зависеть от того, как вы выходите и какие настройки у вас есть. Перезапуск эмулятора может привести к удалению сохраненных данных.   -  person martin clayton    schedule 10.11.2009
comment
Он работает в эмуляторе, но теперь я попробую и на телефоне. Спасибо.   -  person neo2862    schedule 10.11.2009
comment
Это действительно работало на моем телефоне. Большое спасибо! :)   -  person neo2862    schedule 10.11.2009
comment
Теперь вы можете ответить на свой вопрос этим ответом!   -  person Adam Goode    schedule 10.11.2009


Ответы (7)


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

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

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

C:\WTK25\appdb\temp.DefaultColorPhone1

при запуске таким образом в консоли должно быть напечатано: «Работает с корневым хранилищем temp.DefaultColorPhone1».

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

person Pavel Alexeev    schedule 10.11.2009
comment
Спасибо. Сначала я установил Sun WTK, а затем NetBeans. Я не совсем уверен, использует ли NetBeans версию, которую я установил, или что-то еще, что он установил сам. В моей папке DefaultColorPhone нет файла in.use, а также нет файла temp.DefaultColorPhone1 в appdb. - person neo2862; 11.11.2009

Я сам столкнулся с той же проблемой, однако обнаружил, что 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 просто скопируйте исходное имя. В следующий раз, когда вы нажмете «Выполнить» в NetBeans, ваше хранилище записей будет там. Это больно, но, по крайней мере, это дает вам возможность использовать эмулятор для отладки обработки RMS.

person Master Ice    schedule 03.04.2010

Этот вопрос возник уже давно, но я наткнулся на него, когда искал ответ на ту же проблему с эмулятором, но в моем случае это было при использовании 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>

См. документацию. для дополнительных параметров командной строки.

person Charles Harley    schedule 25.02.2012

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

person neo2862    schedule 10.11.2009
comment
@Botond - проверьте ответы Друбина и Павла - если вам все еще не повезло с эмулятором, возможно, отредактируйте свой вопрос, добавив сведения о вашей ОС и настройках разработки - возможно, появятся еще какие-то предложения. - person martin clayton; 11.11.2009

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

В appdb/$phone/*.db

person drubin    schedule 10.11.2009
comment
Я использую NetBeans, и он установил Java ME SDK в мою домашнюю папку C:\Users\Botond\javame-sdk, поэтому у меня есть доступ для записи в папку, но он все равно не работает. Спасибо, в любом случае. - person neo2862; 11.11.2009

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

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

person user469237    schedule 07.10.2010

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

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

~/j2mewtk/2.5.2/appdb/DefaultColorPhone

person Simon Ndunda    schedule 19.04.2015