J2ME RecordStore中的数据不会在会话中持续存在

时间:2009-11-09 22:51:48

标签: java java-me midp rms

我正在使用J2ME构建移动应用程序,并且我发现在程序仍在运行时可以访问我写入RecordStore的数据但是在退出并重新启动它之后它会丢失。没有异常,数据就丢失了。

更新:感谢大家的建议。我在Windows 7上使用NetBeans。我不确定它是否使用我之前安装的WTK版本或其他安装在其他地方的版本。我已经检查了我的WTK文件夹中的Pavel写的文件,但找不到它们。现在我正在测试我的手机和模拟器中的所有其他功能需要持久性的功能,但是能够在模拟器中测试所有内容当然会好得多。

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 个答案:

答案 0 :(得分:3)

如果您使用Sun WTK,它会在其“appdb”文件夹中创建一个名为“in.use”的文件:

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

如果以异常方式关闭模拟器(例如,终止进程),它将不会删除它,并且下次运行模拟器时,它将创建用于存储数据的临时文件夹:

C:\WTK25\appdb\temp.DefaultColorPhone1

以这种方式启动时,它应该在控制台中打印:“使用存储根temp.DefaultColorPhone1运行”。

我修复了它,包括在我的“.bat”文件中每行删除“in.use”文件的行,模拟器运行。但是,一次运行多个模拟器时应该小心。

答案 1 :(得分:2)

我自己遇到了同样的问题,但我发现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处理。

答案 2 :(得分:2)

这个问题已经存在了一段时间,但我偶然发现它同时寻找与模拟器相同问题的答案,但在我的情况下,它是在使用Java ME 3 SDK时。我找到的解决方案可能也可以解决这个问题。

使用:

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

将根据docs:"安装MIDlet,运行它,并在完成后卸载它。"

要保留安装(及其数据),您应该使用:

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

JAD文件URL可以是网址或&#39;文件:///path/to/app.jad'如果要从本地文件系统安装。此安装命令将显示一个应用程序存储编号,您可以使用该编号启动模拟器并通过调用以下命令运行以前安装的应用程序:

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

有关更多命令行选项,请参阅docs

答案 3 :(得分:1)

我终于可以让它在真正的手机上工作了。看来,正如Martin Clayton所说,模拟器重置会清除数据。我仍在寻找一种在模拟器中启用持久性的方法。

答案 4 :(得分:1)

如果您使用的是Windows Vista,则几乎可以使用权限问题。我不确定如何解决此问题,但您可能想要检查运行模拟器的用户是否有权写入模拟器存储。

在appdb / $ phone / * .db

答案 5 :(得分:1)

修复存储问题,检查netbeans平台管理器中的“存储大小”选项。 进入项目属性; 进入平台; 管理模拟器; 选择sun java无线工具包; 进入工具和扩展; 开放的偏好; 存储; 存储大小选项...设置大小。

这对我有用

答案 6 :(得分:0)

我在Ubuntu Linux上遇到过同样的问题,并使用WTK 2.5.2和Netbeans 8.0.2。我后来认为这是因为在没有关闭模拟器的情况下关闭我的笔记本电脑。如果您运行第二个模拟器而不关闭第一个模拟器,也会发生这种情况。

我的解决方案基于最佳答案,只需关闭所有模拟器并删除位于

的文件

~/j2mewtk/2.5.2/appdb/DefaultColorPhone