2

我正在使用 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
            }
        }
    }
}
4

7 回答 7

3

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

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

如果你以不寻常的方式关闭你的模拟器(例如杀死一个进程),它不会删除它,下次你运行模拟器时,它会创建一个临时文件夹来存储数据:

C:\WTK25\appdb\temp.DefaultColorPhone1

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

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

于 2009-11-10T10:24:46.193 回答
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 中点击运行时,您的记录存储将在那里。是痛,

于 2010-04-03T20:38:16.847 回答
2

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

使用:

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

将根据文档:“安装 MIDlet,运行它,并在完成后将其卸载。”

要持久化安装(及其数据),您应该使用:

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

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

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

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

于 2012-02-25T00:54:41.043 回答
1

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

在 appdb/$phone/*.db

于 2009-11-10T08:12:52.090 回答
1

我终于可以让它在真正的手机上工作了。正如 Martin Clayton 所建议的那样,模拟器重置似乎删除了数据。不过,我仍在寻找一种在模拟器中启用持久性的方法。

于 2009-11-10T07:37:25.287 回答
1

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

这对我有用

于 2010-10-07T15:04:38.997 回答
0

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

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

~/j2mewtk/2.5.2/appdb/DefaultColorPhone

于 2015-04-19T16:57:24.120 回答