BlackBerry開(kāi)發(fā)平臺(tái)的永久存儲(chǔ)-Persistent Store
本文和大家重點(diǎn)學(xué)習(xí)一下Blackberry開(kāi)發(fā)平臺(tái)的永久存儲(chǔ)-PersistentStore,主要包括BlackberrySDK5.0版本支持三種存儲(chǔ)方式,PersistentStore存儲(chǔ)對(duì)數(shù)據(jù)類(lèi)型和對(duì)象的要求等內(nèi)容,相信通過(guò)本文的學(xué)習(xí)你對(duì)Blackberry開(kāi)發(fā)平臺(tái)的永久存儲(chǔ)-PersistentStore的概念一定會(huì)有深入的了解。
Blackberry開(kāi)發(fā)平臺(tái)的永久存儲(chǔ)-PersistentStore
BlackberrySDK5.0版本支持三種存儲(chǔ)方式:
◆RMS-RecordStore
◆PersistentStore-persistentstoreforRIMlet
◆SQLLiteforRIMlet
RMS方式的存儲(chǔ)是基于byte數(shù)組的存儲(chǔ),對(duì)象需要先序列化,再存儲(chǔ)。SQLLite是數(shù)據(jù)庫(kù)方式存儲(chǔ),支持SQL語(yǔ)句,這是5.0SDK的新特性。Blackberry最成熟,最流行的存儲(chǔ)方式是PersistentStore,可以直接存儲(chǔ)對(duì)象。本文詳細(xì)介紹PersistentStore的方式。
BlackBerry開(kāi)發(fā)平臺(tái)中PersistentStore存儲(chǔ)對(duì)數(shù)據(jù)類(lèi)型和對(duì)象的要求:
◆被存儲(chǔ)對(duì)象只包含基本數(shù)據(jù)類(lèi)型-int,String,long,boolean,byte,等等
◆被存儲(chǔ)類(lèi)必須要執(zhí)行Persistable接口
◆PersistentStore以Key-Valuepair的方式進(jìn)行數(shù)據(jù)存儲(chǔ),key必須是一個(gè)long值,value的類(lèi)型是Object.下面來(lái)看一個(gè)例子:
1.創(chuàng)建存儲(chǔ)數(shù)據(jù)類(lèi),比如classMyData:
- publicclassMyDataimplementsPersistable{
- privateStringm_userName;
- privateStringm_company;
- privateStringm_title;
- privateintm_age;
- publicMyData(){}
- publicvoidsetUserName(StringuserName){
- m_userName=userName;
- }
- publicStringgetUserName(){
- returnm_userName;
- }
- publicvoidsetCompany(Stringcompany){
- m_company=company;
- }
- publicStringgetCompany(){
- returnm_company;
- }
- publicvoidsetTitle(Stringtitle){
- m_title=title;
- }
- publicStringgetTitle(){
- returnm_title;
- }
- publicvoidsetAge(intage){
- m_age=age;
- }
- publicintgetAge(){
- returnm_age;
- }
- }
注意的是MyData類(lèi)執(zhí)行了Persistable接口,這個(gè)接口沒(méi)有任何要執(zhí)行的函數(shù)。MyData的instancevariable都是基本類(lèi)型,也可以有方法。
2.存儲(chǔ)數(shù)據(jù)
- publicstaticfinallongID=0x5d8a91784555e0f8L;
- publicvoidsaveData(){
- if(myData==null){
- myData=newMyData();
- }
- 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-valuepair的存儲(chǔ),需要一個(gè)ID,對(duì)應(yīng)一個(gè)PersistentObject,存取數(shù)據(jù)時(shí)都要用到,一個(gè)ID只對(duì)應(yīng)一個(gè)PersistentObject。存儲(chǔ)第一步需要從PersistentStore中用ID獲取PersistentObject,再調(diào)用PersistentObject.setContents(Object)接口填入存儲(chǔ)對(duì)象,這步其實(shí)還沒(méi)有保存數(shù)據(jù),需要調(diào)用PersistentObject.commit()保存數(shù)據(jù)。
3.獲取數(shù)據(jù)
- publicstaticfinallongID=0x5d8a91784555e0f8L;
- publicvoidrecoverDataFromStore(){
- 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()+"");
- }
- }
獲取數(shù)據(jù)第一步用ID獲取對(duì)應(yīng)的持久對(duì)象PersistentObject,在調(diào)用PersistentObject.getContents()獲取數(shù)據(jù)對(duì)象,獲取的對(duì)象類(lèi)為Object,需要轉(zhuǎn)換成實(shí)際的類(lèi)型,比如myData=(MyData)dataStore.getContents()。
如下是BlackBerry開(kāi)發(fā)平臺(tái)中PersistentStore的完整例子代碼,可以拷貝到Eclipse里運(yùn)行:
- importnet.rim.device.api.ui.UiApplication;
- publicclassMyAppextendsUiApplication{
- publicstaticvoidmain(String[]args){
- MyAppapp=newMyApp();
- app.enterEventDispatcher();
- }
- publicMyApp(){
- MyScreenmyScreen=newMyScreen();
- pushScreen(myScreen);
- }
- }
- importnet.rim.device.api.util.Persistable;
- publicclassMyDataimplementsPersistable{
- privateStringm_userName;
- privateStringm_company;
- privateStringm_title;
- privateintm_age;
- publicMyData(){}
- publicvoidsetUserName(StringuserName){
- m_userName=userName;
- }
- publicStringgetUserName(){
- returnm_userName;
- }
- publicvoidsetCompany(Stringcompany){
- m_company=company;
- }
- publicStringgetCompany(){
- returnm_company;
- }
- publicvoidsetTitle(Stringtitle){
- m_title=title;
- }
- publicStringgetTitle(){
- returnm_title;
- }
- publicvoidsetAge(intage){
- m_age=age;
- }
- publicintgetAge(){
- returnm_age;
- }
- }
- importnet.rim.device.api.system.PersistentObject;
- importnet.rim.device.api.system.PersistentStore;
- importnet.rim.device.api.ui.Field;
- importnet.rim.device.api.ui.FieldChangeListener;
- importnet.rim.device.api.ui.component.BasicEditField;
- importnet.rim.device.api.ui.component.ButtonField;
- importnet.rim.device.api.ui.component.LabelField;
- importnet.rim.device.api.ui.container.MainScreen;
- publicclassMyScreenextendsMainScreenimplementsFieldChangeListener{
- publicstaticfinallongID=0x5d8a91784555e0f8L;
- privatePersistentObjectdataStore;
- privateBasicEditFielduserNameField;
- privateBasicEditFieldcompanyField;
- privateBasicEditFieldtitleField;
- privateBasicEditFieldageField;
- privateButtonFieldsaveButton;
- privateMyDatamyData;
- publicMyScreen(){
- super();
- setTitle("PersistDataTest");
- initialize();
- addToWindow();
- recoverDataFromStore();
- }
- privatevoidinitialize(){
- userNameField=newBasicEditField("UserName:","",20,BasicEditField.FILTER_DEFAULT);
- companyField=newBasicEditField("CompanyName:","",20,BasicEditField.FILTER_DEFAULT);
- titleField=newBasicEditField("Title:","",20,BasicEditField.FILTER_DEFAULT);
- ageField=newBasicEditField("Age:","",20,BasicEditField.FILTER_NUMERIC);
- saveButton=newButtonField("save");
- saveButton.setChangeListener(this);
- }
- privatevoidaddToWindow(){
- add(userNameField);
- add(titleField);
- add(companyField);
- add(ageField);
- add(saveButton);
- }
- publicvoidsaveData(){
- if(myData==null){
- myData=newMyData();
- }
- 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();
- }
- }
- }
- publicvoidrecoverDataFromStore(){
- 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()+"");
- }
- }
- publicvoidfieldChanged(Fieldfield,intcontext){
- if(field==saveButton){
- saveData();
- }
- }
- }