2012-01-27 71 views
2

我在黑莓中使用持久对象来存储特定于应用程序的配置细节。这里是我如何实施类在黑莓中删除应用程序时删除持久对象

public class Preferences implements Persistable 
{ 
    private static PersistentObject persistentObject = PersistentStore.getPersistentObject(0x2759d6ff72264bdbL); 
    private static Hashtable tbl = new Hashtable(); 

    public static void storeLoginToken(String token) 
    { 
     token = removeCharAt(token,0); 
     token = removeCharAt(token,token.length()-1); 
     tbl.put("token", token); 
     persistentObject.setContents(tbl); 
     persistentObject.commit(); 
    } 

    public static String getLoginToken() 
    { 
     Hashtable tbl = (Hashtable)persistentObject.getContents(); 
     try 
     { 
      String token = tbl.get("token").toString(); 
      System.out.println("Token = "+token); 
      return token; 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 

    } 
} 

但是,如果我卸载/删除应用程序这些存储的值不会被删除。当我下次安装应用程序时,应用程序正在提取旧的存储值。

我该如何在黑莓中正确使用? 感谢

+0

删除应用程序有时设备不要求重启后;如果您在安装相同的应用程序之前重新启动设备,则问题应该解决; “持久对象未被删除”的问题大多发生在黑莓5.0版本设备中;你正在使用哪个版本? – alishaik786 2012-01-27 14:18:18

+0

是的,我正在使用版本5.0 – Zach 2012-01-27 15:01:29

回答

7

创建一个自定义Hashtable类这样

package com.myapp.items; 


import net.rim.device.api.util.Persistable; 

import java.util.*; 

public class MyAppHashtable extends Hashtable implements Persistable{ 

} 

而更改您的代码

public class Preferences 
{ 
    private static PersistentObject persistentObject = PersistentStore.getPersistentObject(0x2759d6ff72264bdbL); 
    private static MyAppHashtable tbl = new MyAppHashtable(); 

    public static void storeLoginToken(String token) 
    { 
     token = removeCharAt(token,0); 
     token = removeCharAt(token,token.length()-1); 
     tbl.put("token", token); 
     persistentObject.setContents(tbl); 
     persistentObject.commit(); 
    } 

    public static String getLoginToken() 
    { 
     MyAppHashtable tbl = (MyAppHashtable)persistentObject.getContents(); 
     try 
     { 
      String token = tbl.get("token").toString(); 
      System.out.println("Token = "+token); 
      return token; 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 

    } 
} 

这是为了让我们坚持以下信息来自RIM

BlackBerry持久性模型

当您使用BlackBerry持久性模型时,只有在商店包含属于已删除应用程序的数据时才会删除数据。

例如,如果应用程序存储名为com.mycompany.application.storage的程序包的对象,且BlackBerry智能手机上没有其他应用程序引用该程序包,则会删除持久存储区和删除的应用程序。

如果对象被包装在容器中,例如Vector,也是如此。即使Vector中只有一个元素的包名称未被其他应用程序使用,整个Vector也会从持久性存储区中删除。

注意:如果该应用程序不属于任何对象存储与一个识别封装结构,(例如,存储java.util.Vectorjavax.microedition.location.AddressInfo对象的应用程序),应用程序应该创建和使用的是,为了以确定延伸Vector一个类Vector属于给定的应用程序。当您存储此Vector(由其软件包唯一标识)时,确保在删除应用程序时将数据从持久性存储中删除。

info is from here

+0

谢谢你的答案。我按照你的说法来实施它。但MyAppHashtable tbl =(MyAppHashtable)persistentObject.getContents();抛出类抛出异常。任何想法? – Zach 2012-01-27 14:58:45

+2

是的,因为你正在读取保存为散列表的旧值。清除持久存储。删除所有值并删除商店。然后重试。它应该工作。 – rfsk2010 2012-01-27 15:01:19

+0

这对你有帮助吗? – rfsk2010 2012-02-01 09:24:51