1

我有一个 BlackBerry 应用程序,它在首次安装应用程序时启动(应用程序加载)并显示注册屏幕。稍后,应用程序将与主屏幕一起加载。注册屏幕仅在首次加载时出现。我通过将boolean值存储在PersistentStore. 如果该值存在,则不会出现注册屏幕。

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

我知道为了在删除/卸载应用程序时删除 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;

}

然而,这并没有帮助,并且booleanflag 的值没有从PersistentStore. 请指教。


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

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

并删除

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

boolean正在保存值的 B 类中,我观察到boolean每次关闭应用程序时都会删除该值。这不应该发生,并且只有在应用程序被删除/卸载的情况下才应该删除该值。任何指针?

4

1 回答 1

1

其工作方式是 BlackBerry OS 查看您存储在PersistentStore. 如果它识别出这些对象只能由您的应用程序使用,那么它将在您卸载应用程序时删除它们。但是,如果存储对象的类是其他应用程序使用的类,那么您的数据不会被删除。

你已经像这样声明了你的助手类:

public class PersistentStoreHelper extends Hashtable implements Persistable{

但助手类不是存储的内容。你的助手类只是一个助手,它为你存储其他东西。在您的情况下,它正在存储以下内容:

public static Hashtable persistentHashtable;

但是,该对象是 type 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(); 
} 
于 2013-04-01T22:19:04.830 回答