【问题标题】:Delete Persistent Store data when App is uninstalled/deleted卸载/删除 App 时删除 Persistent Store 数据
【发布时间】:2013-03-22 12:34:06
【问题描述】:

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

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;

}

但这并没有帮助,boolean 的标志值不会从PersistentStore 中清除。请指教。


EDIT:当我将上面的 PersistentStoreHelper 类更改为

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

并删除

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

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

【问题讨论】:

    标签: blackberry persistent persistent-storage


    【解决方案1】:

    其工作方式是 BlackBerry 操作系统查看您存储在 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(); 
    } 
    

    【讨论】:

    • 谢谢@Nate。我正在努力解决它。以前我调用以下方式获取内容:if (PersistentStoreHelper.persistentObject.getContents() == null) { PersistentStoreHelper.persistentHashtable = new Hashtable(); PersistentStoreHelper.persistentObject.setContents(PersistentStoreHelper.persistentHashtable); } else { PersistentStoreHelper.persistentHashtable = (Hashtable)PersistentStoreHelper. persistentObject.getContents(); } 我无法编辑到:persistentHashtable = (MyAppsHashtable)persistentObject.getContents(); 怎么办?
    • @Sarah,请在上面的答案中查看我的第二次更新。谢谢。
    • 我一直在使用您提供的编辑,但没有帮助;我得到一个类型不匹配:Cannot convert from Hashtable to PersistentStoreHelper.MyAppsHashtable。你能帮忙吗?编辑:问题现在在PersistentStoreHelper.persistentObject.setContents(PersistentStoreHelper.persist‌entHashtable);。此行给出错误:persist‌entHashtable 无法解析或不是字段。
    • @Sarah,我看不到您的确切代码,但我猜您的问题与您没有将PersistentStoreHelper 用作真正的类。你只是把东西倒在那里。您应该做的是保留从该类内部 的持久存储加载和保存所需的所有代码,并在该类中处理初始化存储。我很确定你不会那样做。首先,代码中的所有public static 变量都应该是private。然后,我答案底部的代码应该真的在构造函数中,或者initialize() ...
    • @Sarah,另外,我放了一个PersistentStoreHelper 类的示例实现,我认为它比你尝试使用的online here 更干净。文件顶部的类 cmets 中显示了如何从类外部使用它的示例。
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 2018-03-05
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多