使用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();
  }
 }

}

 

 

原创粉丝点击