2012-01-27 32 views
2

我在黑莓中使用持久對象來存儲特定於應用程序的配置細節。這裏是我如何實施類在黑莓中刪除應用程序時刪除持久對象

public class Preferences implements Persistable 
{ 
    private static PersistentObject persistentObject = PersistentStore.getPersistentObject(0x2759d6ff72264bdbL); 
    private static Hashtable tbl = new Hashtable(); 

    public static void storeLoginToken(String token) 
    { 
     token = removeCharAt(token,0); 
     token = removeCharAt(token,token.length()-1); 
     tbl.put("token", token); 
     persistentObject.setContents(tbl); 
     persistentObject.commit(); 
    } 

    public static String getLoginToken() 
    { 
     Hashtable tbl = (Hashtable)persistentObject.getContents(); 
     try 
     { 
      String token = tbl.get("token").toString(); 
      System.out.println("Token = "+token); 
      return token; 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 

    } 
} 

但是,如果我卸載/刪除應用程序這些存儲的值不會被刪除。當我下次安裝應用程序時,應用程序正在提取舊的存儲值。

我該如何在黑莓中正確使用? 感謝

+0

刪除應用程序有時設備不要求重啓後;如果您在安裝相同的應用程序之前重新啓動設備,則問題應該解決; 「持久對象未被刪除」的問題大多發生在黑莓5.0版本設備中;你正在使用哪個版本? – alishaik786 2012-01-27 14:18:18

+0

是的,我正在使用版本5.0 – Zach 2012-01-27 15:01:29

回答

7

創建一個自定義Hashtable類這樣

package com.myapp.items; 


import net.rim.device.api.util.Persistable; 

import java.util.*; 

public class MyAppHashtable extends Hashtable implements Persistable{ 

} 

而更改您的代碼

public class Preferences 
{ 
    private static PersistentObject persistentObject = PersistentStore.getPersistentObject(0x2759d6ff72264bdbL); 
    private static MyAppHashtable tbl = new MyAppHashtable(); 

    public static void storeLoginToken(String token) 
    { 
     token = removeCharAt(token,0); 
     token = removeCharAt(token,token.length()-1); 
     tbl.put("token", token); 
     persistentObject.setContents(tbl); 
     persistentObject.commit(); 
    } 

    public static String getLoginToken() 
    { 
     MyAppHashtable tbl = (MyAppHashtable)persistentObject.getContents(); 
     try 
     { 
      String token = tbl.get("token").toString(); 
      System.out.println("Token = "+token); 
      return token; 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 

    } 
} 

這是爲了讓我們堅持以下信息來自RIM

BlackBerry持久性模型

當您使用BlackBerry持久性模型時,只有在商店包含屬於已刪除應用程序的數據時纔會刪除數據。

例如,如果應用程序存儲名爲com.mycompany.application.storage的程序包的對象,且BlackBerry智能手機上沒有其他應用程序引用該程序包,則會刪除持久存儲區和刪除的應用程序。

如果對象被包裝在容器中,例如Vector,也是如此。即使Vector中只有一個元素的包名稱未被其他應用程序使用,整個Vector也會從持久性存儲區中刪除。

注意:如果該應用程序不屬於任何對象存儲與一個識別封裝結構,(例如,存儲java.util.Vectorjavax.microedition.location.AddressInfo對象的應用程序),應用程序應該創建和使用的是,爲了以確定延伸Vector一個類Vector屬於給定的應用程序。當您存儲此Vector(由其軟件包唯一標識)時,確保在刪除應用程序時將數據從持久性存儲中刪除。

info is from here

+0

謝謝你的答案。我按照你的說法來實施它。但MyAppHashtable tbl =(MyAppHashtable)persistentObject.getContents();拋出類拋出異常。任何想法? – Zach 2012-01-27 14:58:45

+2

是的,因爲你正在讀取保存爲散列表的舊值。清除持久存儲。刪除所有值並刪除商店。然後重試。它應該工作。 – rfsk2010 2012-01-27 15:01:19

+0

這對你有幫助嗎? – rfsk2010 2012-02-01 09:24:51

相關問題