2013-04-01 89 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

相关问题