使用Blackberry平台的永久存储-PersistentStore
来源:互联网 发布:圣元 淘宝网折800 编辑:程序博客网 时间:2024/05/10 03:32
Blackberry SDK 5.0 版本支持三种存储方式:
- RMS - Record Store
- PersistentStore - persistent store for RIMlet
- SQL Lite for RIMlet
RMS方式的存储是基于byte数组的存储,对象需要先序列化,再存储。SQL Lite是数据库方式存储,支持SQL语句,这是5.0 SDK的新特性。Blackberry最成熟,最流行的存储方式是PersistentStore,可以直接存储对象。本文详细介绍PersistentStore的方式。
PersistentStore存储对数据类型和对象的要求:
- 被存储对象只包含基本数据类型 - int, String, long, boolean, byte, 等等
- 被存储类必须要执行 Persistable 接口
PersistentStore以Key-Value pair的方式进行数据存储,key必须是一个long值,value的类型是Object. 下面来看一个例子:
1. 创建存储数据类,比如class MyData:
public class MyData implements Persistable{
private String m_userName;
private String m_company;
private String m_title;
private int m_age;
public MyData(){}
public void setUserName(String userName){
m_userName = userName;
}
public String getUserName(){
return m_userName;
}
public void setCompany(String company){
m_company = company;
}
public String getCompany(){
return m_company;
}
public void setTitle(String title){
m_title = title;
}
public String getTitle(){
return m_title;
}
public void setAge(int age){
m_age = age;
}
public int getAge(){
return m_age;
}
}
注意的是MyData类执行了Persistable接口,这个接口没有任何要执行的函数。MyData的instance variable都是基本类型,也可以有方法。
2. 存储数据
public static final long ID = 0x5d8a91784555e0f8L;
public void saveData(){
if (myData == null){
myData = new MyData();
}
myData.setUserName("Protoss");
myData.setCompany("Blizzard");
myData.setTitle("Manager");
myData.setAge(26);
if (dataStore == null){
dataStore = PersistentStore.getPersistentObject(ID);
}
synchronized(dataStore){
if (dataStore.getContents() == null){
dataStore.setContents(myData);
dataStore.commit();
}
}
}
PersistentStore是key-value pair的存储,需要一个ID,对应一个PersistentObject,存取数据时都要用到,一个ID只对应一个PersistentObject。存储第一步需要从PersistentStore中用ID获取PersistentObject,再调用PersistentObject.setContents(Object)接口填入存储对象,这步其实还没有保存数据,需要调用PersistentObject.commit()保存数据。
3. 获取数据
public static final long ID = 0x5d8a91784555e0f8L;
public void recoverDataFromStore(){
if (dataStore == null){
dataStore = PersistentStore.getPersistentObject(ID);
}
synchronized(dataStore){
if (dataStore.getContents() != null){
myData = (MyData) dataStore.getContents();
}
}
if (myData != null){
userNameField.setText(myData.getUserName());
companyField.setText(myData.getCompany());
titleField.setText(myData.getTitle());
ageField.setText(myData.getAge()+"");
}
}
获取数据第一步用ID获取对应的持久对象PersistentObject,在调用PersistentObject.getContents()获取数据对象,获取的对象类为Object,需要转换成实际的类型,比如 myData = (MyData) dataStore.getContents()。
如下是PersistentStore的完整例子代码,可以拷贝到Eclipse里运行:
import net.rim.device.api.ui.UiApplication;
public class MyApp extends UiApplication{
public static void main(String[] args){
MyApp app = new MyApp();
app.enterEventDispatcher();
}
public MyApp(){
MyScreen myScreen = new MyScreen();
pushScreen(myScreen);
}
}
import net.rim.device.api.util.Persistable;
public class MyData implements Persistable{
private String m_userName;
private String m_company;
private String m_title;
private int m_age;
public MyData(){}
public void setUserName(String userName){
m_userName = userName;
}
public String getUserName(){
return m_userName;
}
public void setCompany(String company){
m_company = company;
}
public String getCompany(){
return m_company;
}
public void setTitle(String title){
m_title = title;
}
public String getTitle(){
return m_title;
}
public void setAge(int age){
m_age = age;
}
public int getAge(){
return m_age;
}
}
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.MainScreen;
public class MyScreen extends MainScreen implements FieldChangeListener{
public static final long ID = 0x5d8a91784555e0f8L;
private PersistentObject dataStore;
private BasicEditField userNameField;
private BasicEditField companyField;
private BasicEditField titleField;
private BasicEditField ageField;
private ButtonField saveButton;
private MyData myData;
public MyScreen(){
super();
setTitle("Persist Data Test");
initialize();
addToWindow();
recoverDataFromStore();
}
private void initialize(){
userNameField = new BasicEditField("User Name: ", "", 20, BasicEditField.FILTER_DEFAULT);
companyField = new BasicEditField("Company Name: ", "", 20, BasicEditField.FILTER_DEFAULT);
titleField = new BasicEditField("Title: ", "", 20, BasicEditField.FILTER_DEFAULT);
ageField = new BasicEditField("Age: ", "", 20, BasicEditField.FILTER_NUMERIC);
saveButton = new ButtonField("save");
saveButton.setChangeListener(this);
}
private void addToWindow(){
add(userNameField);
add(titleField);
add(companyField);
add(ageField);
add(saveButton);
}
public void saveData(){
if (myData == null){
myData = new MyData();
}
myData.setUserName(userNameField.getText());
myData.setCompany(companyField.getText());
myData.setTitle(titleField.getText());
myData.setAge(Integer.valueOf(ageField.getText()).intValue());
if (dataStore == null){
dataStore = PersistentStore.getPersistentObject(ID);
}
synchronized(dataStore){
if (dataStore.getContents() == null){
dataStore.setContents(myData);
dataStore.commit();
}
}
}
public void recoverDataFromStore(){
if (dataStore == null){
dataStore = PersistentStore.getPersistentObject(ID);
}
synchronized(dataStore){
if (dataStore.getContents() != null){
myData = (MyData) dataStore.getContents();
}
}
if (myData != null){
userNameField.setText(myData.getUserName());
companyField.setText(myData.getCompany());
titleField.setText(myData.getTitle());
ageField.setText(myData.getAge()+"");
}
}
public void fieldChanged(Field field, int context) {
if (field == saveButton){
saveData();
}
}
}
- 使用Blackberry平台的永久存储-PersistentStore
- 关于BlackBerry API的使用
- 关于BlackBerry API的使用
- NSUserDefaults轻量级永久存储数据使用介绍
- Android SharedPreferences 永久存储简单的数据
- localStorage----客户端永久存储数据的方法
- BlackBerry开发平台常见问题
- BlackBerry平台获取手机号
- 永久使用卡巴斯基的方法
- 真正永久使用的电子邮件
- 关于blackberry平台下sqlite事务的处理方式
- BlackBerry TreeField 的使用及更换“+/-”图标
- BlackBerry 开发环境中javaloader的使用
- blackberry bold 不提示"大容量存储设备" 的解决方法
- BlackBerry平台发送短信实现
- Blackberry平台开发,教程,范例
- BlackBerry平台文件目录访问
- J2ME 实现永久存储
- 优化Javascipt代码
- opengl在vs2010下的配置问题
- RSA Authentication Agent 6.0 and 5.3.4 for PAM
- C++加入IE控件CExplorer1及响应
- ubuntu下安装latex
- 使用Blackberry平台的永久存储-PersistentStore
- C# 测量用指定的 Font 绘制的指定字符串。(指定字符串的像素长度)
- 读书笔记之编程之美 - 1.2 中国象棋将帅问题(更快的算法)
- 吴冠中
- 新手上路
- 学生系
- 文强之死
- 图书馆
- 让JSON请求和参数请求一样,可以通过Struts2的模型驱动给Action的类成员变量赋值(字段驱动与模型驱动)