J2ME RecordStore 中的数据不会跨会话保持不变

Posted

技术标签:

【中文标题】J2ME RecordStore 中的数据不会跨会话保持不变【英文标题】:Data in J2ME RecordStore does not persist across sessions 【发布时间】:2009-11-09 22:51:47 【问题描述】:

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

【问题讨论】:

这是在实体手机还是模拟器上运行?数据是否在模拟器会话之间持久存在取决于您退出的方式以及您的设置。模拟器重启可能会删除持久化的数据。 它在模拟器中运行,但现在我也将在手机上尝试它。谢谢。 它确实在我的手机上工作。非常感谢! :) 你现在可以用这个答案来回答你自己的问题了! 【参考方案1】:

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

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

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

C:\WTK25\appdb\temp.DefaultColorPhone1

以这种方式启动时,它应该在控制台中打印:“Running with storage root temp.DefaultColorPhone1”。

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

【讨论】:

谢谢。我先安装了 Sun WTK,然后是 NetBeans。我不确定 NetBeans 是使用我安装的版本还是它自己安装的其他版本。我的 DefaultColorPhone 文件夹中没有 in.use 文件,appdb 中也没有 temp.DefaultColorPhone1。【参考方案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 处理。

【讨论】:

【参考方案3】:

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

使用:

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

将根据docs:“安装一个 MIDlet,运行它,完成后卸载它。”

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

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

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

@Botond - 检查 drubin 和 Pavel 的答案 - 如果您仍然无法使用模拟器,可以编辑您的问题以添加您的操作系统和开发设置的详细信息 - 也许会有更多建议。 【参考方案5】:

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

在 appdb/$phone/*.db 中

【讨论】:

我正在使用 NetBeans,它已在我的主文件夹 C:\Users\Botond\javame-sdk 中安装了 Java ME SDK,因此我对该文件夹具有写入权限,但它仍然不起作用。还是谢谢。【参考方案6】:

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

这对我有用

【讨论】:

【参考方案7】:

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

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

~/j2mewtk/2.5.2/appdb/DefaultColorPhone

【讨论】:

以上是关于J2ME RecordStore 中的数据不会跨会话保持不变的主要内容,如果未能解决你的问题,请参考以下文章

J2ME - 在添加记录时直接从 RecordStore 读取或将记录存储在 Vector 中,稍后从该向量中检索它们

遍历所有 RecordStore java me

j2me - 如何使用 RMS 存储自定义对象

您如何在 Netbeans 中清除您的 midlet 的 RecordStore?

从 RecordStore 中删除记录

J2ME 中的数据库