2013-04-01 132 views
1

我有一個是第一次安裝應用程序時,與註冊屏幕啓動(應用程序負載)黑莓應用程序。稍後,應用程序將加載主屏幕。註冊屏幕僅在第一次加載時出現。我在PersistentStore存儲boolean值達到這一點。如果該值存在,則註冊屏幕不會出現。刪除持久存儲的數據時應用程序被卸載/刪除

PersistentStoreHelper.persistentHashtable.put("flagged",Boolean.TRUE); 
PersistentStoreHelper.persistentObject.commit(); 
UiApplication.getUiApplication().pushScreen(new MyScreen()); 

我知道的事實,爲了刪除刪除/卸載應用程序的持久性存儲,我必須作出的哈希表我自己的一個子類,因此,我已宣佈了哈希表中的一個單獨的類:

public class PersistentStoreHelper extends Hashtable implements Persistable{ 

    public static PersistentObject persistentObject; 
    public static final long KEY = 0x9df9f961bc6d6daL; 
    public static Hashtable persistentHashtable; 

} 

然而,這並沒有幫助和標誌的boolean值不是從PersistentStore清除。請指教。


EDIT:當我改變上述PersistentStoreHelper

public static PersistentObject persistentObject = 
    PersistentStore.getPersistentObject(KEY); 

和從類B,其中被保存boolean值除去

PersistentStoreHelper.persistentObject = 
    PersistentStore.getPersistentObject(PersistentStoreHelper.KEY); 

,我觀察到該boolean值被刪除每個應用程序是封閉的時間。這應該不會發生,只有在應用程序被刪除/卸載的情況下才能刪除該值。任何指針?

回答

1

這種工作方式是BlackBerry OS看着你被存儲在PersistentStore的對象。如果它確認這些對象只能被您的應用使用,那麼當您卸載該應用時,它將會將其刪除。然而,如果存儲的對象的類是由其他應用程序使用的類,那麼你的數據將不會刪除。

您已聲明助手類是這樣的:

public class PersistentStoreHelper extends Hashtable implements Persistable{ 

但輔助類是不被存儲的內容。助手類只是一個幫手,存儲其他的東西給你。在你的情況下,存儲這樣的:

public static Hashtable persistentHashtable; 

但是,該對象是java.util.Hashtable型,這是許多應用程序所使用的一類。所以,當你卸載你的應用程序時,它不會被刪除。你應該做的是這樣的:

public class PersistentStoreHelper implements Persistable { // so inner class = Persistable 

    public static PersistentObject persistentObject; 
    public static final long KEY = 0x9df9f961bc6d6daL; 
    /** 
     * persistentHashtable is now an instance of a class that 
     * only exists in your app 
     */ 
    public static MyAppsHashtable persistentHashtable; 

    private class MyAppsHashtable extends Hashtable implements Persistable { 
     // don't need anything else ... the declaration does it all! 
    } 
} 

我不能看到它在這裏,但我假設你的地方有這樣的代碼:

persistentObject = PersistentStore.getPersistentObject(KEY); 

,然後當你要保存數據返回到商店,你正在做這樣的事情;

persistentHashtable.put("SomeKey", someNewData); 
persistentObject.setContents(persistentHashtable); 
persistentObject.commit(); 

只是將數據添加到persistentHashtable不保存它(永久)。希望你已經有了那個角色。


注:,如果你做這些改變,不要期望這行代碼的工作,下次你運行你的應用程序時間:

persistentHashtable = (MyAppsHashtable)persistentObject.getContents(); 

因爲你的代碼的最後一個版本沒有使用MyAppsHashtable類,所以加載的數據不會是這種類型的。這是第一次正確認識這一點很重要的原因之一。一般來說,我總是將數據保存在PersistentStore中,該數據包含在一個頂級Hashtable子類中,該子類實現了Persistable。我稍後可能會更改它的內容,但我永遠不會更改該頂級存儲對象的簽名。希望你還沒有發佈你的應用程序。


更新:在回答您的意見/以下問題:

if (PersistentStoreHelper.persistentObject.getContents() == null) { 
    PersistentStoreHelper.persistentHashtable = new MyAppsHashtable();  
    PersistentStoreHelper.persistentObject.setContents(PersistentStoreHelper.persist‌entHashtable); 
} else { 
    PersistentStoreHelper.persistentHashtable = 
     (MyAppsHashtable)PersistentStoreHelper.persistentObject.getContents(); 
} 
+0

感謝@Nate。我正在努力解決它。以前我以下面的方式調用getContents: 'if(PersistentStoreHelper.persistentObject.getContents()== null) { \t PersistentStoreHelper.persistentHashtable = new Hashtable(); \t PersistentStoreHelper.persistentObject.setContents(PersistentStoreHelper.persistentHashtable);其他{ \t PersistentStoreHelper.persistentHashtable =(Hashtable)PersistentStoreHelper。我不能編輯:'persistentHashtable =(MyAppsHashtable)persistentObject.getContents();'怎麼去? – Sarah

+0

@Sarah,請參閱上面的答案我的第二次更新。謝謝。 – Nate

+0

我一直在與您提供的編輯工作,但它沒有幫助;我得到一個類型不匹配:'不能從Hashtable轉換爲PersistentStoreHelper.MyAppsHashtable'。你能幫忙嗎?編輯︰問題現在在'PersistentStoreHelper.persistentObject.setContents(PersistentStoreHelper.persistentHashtable);'。此行提供了一個錯誤:persistentHashtable無法解析或不是字段。 – Sarah

相關問題