【问题标题】:Persistent Store - Save, Read and Overwrite data持久存储 - 保存、读取和覆盖数据
【发布时间】:2013-03-21 15:58:27
【问题描述】:

我正在尝试将 10 个字符串值保存在我的 BlackBerry 应用程序中的 PersistentStore 中。这个想法是在任何给定时间保存最新的 10 个项目(字符串值)。保存前 10 个值并键入第 11 个值时,应该:

  • 删除第一个条目
  • 将剩余的 9 个条目移到订单上方
  • 将第 11 个条目保存为第 10 个值

这是我要遵循的逻辑。随着条目的不断增加,我将存储最多 10 个条目,这将是最新的 10 个值。我尝试通过saveChatMsg() 方法保存String 值:

 public void saveChatMsg()
 {
     if(xx<10)
     {
         PersistentStoreHelper.persistentHashtable.put("chatMsg"+xx,chatToSave);
         xx=xx+1;
         if(xx==10)
         {
             PersistentStoreHelper.persistentHashtable.put("xxValue",Integer.toString(0));
         }
         else
         {
             PersistentStoreHelper.persistentHashtable.put("xxValue",Integer.toString(xx));
         }

     }
 }

其中 xx 是一个从 0 到 9 的整数。但是,虽然这是保存消息,但当我检索消息时,它不会按时间顺序显示。 调用此方法在 4 个不同的地方,因此保存的 10 条消息的顺序不正确;最新消息可能显示为第 6 个值而不是 10 个等。请评论并建议如何实施。

【问题讨论】:

    标签: blackberry persistent overwrite persistent-storage


    【解决方案1】:

    如果您想要一个包含 10 条消息的列表,我会使用 Vector。向量对它们有一个顺序and they are Persistable (*)。您可以从 Vector 中删除第一个(最旧的)元素,并在末尾添加一个新元素。

    看起来您的持久存储保留了一个主要的Hashtable(这很好)。将您的持久模型更改为:

    - Hashtable
        - Vector (key = "chatMsgs")
            - String
            - String
            - String
            - String
            - String
            - String
            - String
            - String
            - String
            - String
    

    所以,也许是这样的:

    public void saveChatMsg(String newMsg) {
        Vector msgs = PersistentStoreHelper.persistentHashtable.get("chatMsgs");
        // add the new msg (to the end of the vector)
        msgs.addElement(newMsg);
        // delete old messages, if the vector is full
        while (msgs.size() > 10) {
            msgs.removeElementAt(0);
        }
        // store the modified vector back to the persistent store
        PersistentStoreHelper.persistentHashtable.put("chatMsgs", msgs);
        // I'm assuming your PersistentStoreHelper calls commit() somewhere in here
    }
    
    /** @param index - 0 is the oldest, 9 is the newest */
    public String getChatMsg(int index) {
        Vector msgs = PersistentStoreHelper.persistentHashtable.get("chatMsgs");
        return (String)msgs.elementAt(index);
    }
    

    编辑:

    (*) 我链接到的 BlackBerry API 文档和 BlackBerry Java Storage APIs 文档都将 java.util.Vector 列为 Persistable 类。 So does this answer/comment。但是,Vector 的实际 API javadoc 并没有说它实现了Persistable。我现在无法运行代码,但如果 VectorString 对象对您不起作用,您始终可以使用 Vector 的子类,例如 ContentProtectedVector,即API 文档明确列为Persistable。为了他人的利益,如果您最终需要这样做,请发表评论。

    【讨论】:

    • 谢谢。这很有帮助。但是,我遇到了持久性问题。保存为持久的字符串值,在删除/卸载应用程序然后重新安装时不会被删除。可以在这里问这个问题还是我应该将这个问题作为一个单独的问题来解决?我之所以在这里问是因为我要保存到持久的字符串值。
    • 这行代码中的“chatMsgs”是什么:Vector msgs = PersistentStoreHelper.persistentHashtable.get("chatMsgs")。我需要在我的 PersistentStore 类中创建一个向量吗?
    • @Sarah,是的,正如您在我上面的小图片中看到的,您应该将一个哈希表放入 PersistentStore。 Hashtable里面应该是一个Vector,Vector里面应该是10个Strings。因此,无论您在何处初始化 PersistentStore,都将为键 "chatMsgs" 插入一个 Vector,而不是存储 10 个 String 对象,所有对象都有自己的键("chatMsg00""chatMsg01" 等)
    • @Sarah,关于您的第一个问题,see the answer hereon blackberry.com here。如果您想删除它,请将您的 Hashtable 设为您自己的子类(例如 public class SarahsHashtable extends Hashtable implements Persistable {)。
    • 我从未在持久存储中使用过向量。 “chatMsgs”是密钥的长值吗?这有意义吗? 'public void saveChatMsg1(String newMsg) { final long KEY = 0x9df9f961bc6d6daL; Vector msgs = (Vector) PersistentStoreHelper.persistentHashtable.get(KEY); // 添加新的 msg(到向量的末尾) if( msgs == null ) { msgs = new Vector(); PersistentStoreHelper.persistentObject.setContents(msgs); PersistentStoreHelper.persistentObject.commit(); } msgs.addElement(newMsg);'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多