卸载/删除应用程序时删除持久存储数据

时间:2013-04-01 12:20:49

标签: blackberry persistent persistent-storage

首次安装App时,我有一个BlackBerry应用程序启动(App load)并带有Registration屏幕。之后,应用程序将加载主屏幕。注册屏幕仅在首次加载时出现。我通过在boolean中存储PersistentStore值来实现此目的。如果该值存在,则不会显示“注册”屏幕。

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

我知道为了在删除/卸载App时删除Persistent Store,我必须使Hashtable成为我自己的子类,因此我在单独的类中声明了Hashtable:

public class PersistentStoreHelper extends Hashtable implements Persistable{

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

}

然而,这没有帮助,并且boolean的{​​{1}}值未被清除PersistentStore。请指教。


编辑:当我将上述 PersistentStoreHelper 类更改为

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

并删除

PersistentStoreHelper.persistentObject = 
    PersistentStore.getPersistentObject(PersistentStoreHelper.KEY);
从保存boolean值的B类

,我发现每次关闭App时都会删除boolean值。这不应该发生,只有在删除/卸载应用程序时才应删除该值。有什么指针吗?

1 个答案:

答案 0 :(得分: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(); } 。我可能稍后改变其中的内容,但我永远不会更改该顶级存储对象的签名。希望你还没有发布你的应用程序。


更新:回复您的评论/问题:

{{1}}