2013-03-31 50 views
1

我試圖在我的BlackBerry App中保存10個字符串值PersistentStore。這個想法是在任何給定的時間保存最新的10個項目(字符串值)。當第10個值將被保存,11值類型的,它應該:持久存儲 - 保存,讀取和覆蓋數據

  • 刪除的第一個條目
  • 移動順序
  • 保存11項作爲第十屆值
  • 以上,其餘9項

這是我想要遵循的邏輯。隨着條目的不斷增加,我將存儲最多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. 然而一個int,而這是該消息保存在,當檢索到消息時,它是不按照時間順序顯示。在4個不同的地方調用此方法,因此保存的10條消息的順序不正確;最新的消息可能會顯示爲第6個值而不是10個等。請注意和建議如何實施。

回答

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); 
} 

編輯:

(*)黑莓API文檔我聯繫以及BlackBerry Java Storage APIs文檔,均將java.util.Vector列爲Persistable類。 So does this answer/comment。但是,Vector的實際API javadoc並沒有說它實現了Persistable。我目前無法運行代碼,但如果VectorString對象不適合您,則可以始終使用Vector的子類,如ContentProtectedVector,API文檔明確列出爲Persistable。發表評論,如果你需要這樣做,爲他人的利益。

+0

謝謝。這很有幫助。但是,我遇到了持久性問題。當應用程序被刪除/卸載並重新安裝時,保存爲持久性的字符串值不會被刪除。在這裏問這個問題還可以,或者我應該把這個問題作爲一個單獨的問題來解決?我在這裏問,因爲我保存的字符串值是持久的。 – Sarah

+0

這行代碼中的「chatMsgs」是什麼:Vector msgs = PersistentStoreHelper.persistentHashtable.get(「chatMsgs」)。我需要在PersistentStore類中創建一個向量嗎? – Sarah

+0

@Sarah,是的,正如你在我上面的小圖*看到的,你應該把一個Hashtable放入PersistentStore。在Hashtable中應該是一個Vector,並且Vector中應該是10個字符串。所以,無論你初始化你的PersistentStore,你都會爲''chatMsgs''鍵插入一個Vector,而不是存儲10個String對象,全部使用它們自己的鍵('「chatMsg00」''''chatMsg01「'等) – Nate