关于移动数据库的开发!

supershan 2004-10-28 02:50:15
利用一周时间,上网看了关于J2ME的资料,自已也动手做了一些例子,但关于移动数据库方面的介绍实在太少,J2ME中的RMS应用没有关系型数据库方便,请问谁有这方面的应用?

请提供例子,网址!谢谢!!!
...全文
172 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongdong715 2004-11-03
  • 打赏
  • 举报
回复
并且成功在诺基亚7120进行测试了..
dongdong715 2004-11-03
  • 打赏
  • 举报
回复
else if(c==c6){
if(l.size()==0){
alert1.setString("数据库里没有记录,不能进行删除!");
display.setCurrent(alert1);
}
else{
int i=l.getSelectedIndex();
int count4=0;
try{
while(re.hasNextElement()){
int id2=re.nextRecordId();
if(i==count4){
rs.deleteRecord(id2);
display.setCurrent(al1);
}
count4++;
}

re.rebuild();
FleshList();
}catch(Exception e){
alert1.setString("RMS数据库读出错误!");
display.setCurrent(alert1);
}
}
}
else if(c==c8){
if(l.size()==0){
alert1.setString("数据库里没有记录,不能进行搜索!");
display.setCurrent(alert1);
}
else
display.setCurrent(f4);
}
else if(c==aboutc){
display.setCurrent(aboutalert);
}
}
}
class Hander2 implements CommandListener{
public void commandAction(Command c,Displayable d){
if(c==c3){
// l.setSelectedIndex(l.getSelectedIndex(),true);

display.setCurrent(l);
}
else if(c==c4){
str1=tf1.getString();
if(str1.length()!=0){
int cc=0;
int ccc=0;
int dd=l.size();

while(cc<(dd)){
if(l.getString(cc).equals(tf1.getString())){
alert1.setString("已存在同名记录!");
display.setCurrent(alert1);
return ;

}
cc++;
}


try{
baos=new ByteArrayOutputStream();
dos=new DataOutputStream(baos);

str1=tf1.getString();
//l.append(str1,null);
// System.out.println(str1);
dos.writeUTF(str1);
str2=tf2.getString();
dos.writeUTF(str2);
str3=tf3.getString();
dos.writeUTF(str3);
str4=tf.getString();
dos.writeUTF(str4);
str5=tf4.getString();
dos.writeUTF(str5);
byte data[]=baos.toByteArray();
rs.addRecord(data,0,data.length);
re.rebuild();
str1=null;
str2=null;
str3=null;
str4=null;
str5=null;

}
catch(Exception e){

alert1.setString("数据保存失败!");
display.setCurrent(alert1);
}
display.setCurrent(l);
tf1.setString("");
tf2.setString("");
tf3.setString("");
tf.setString("");
tf4.setString("");
}
else
{ alert1.setString("姓名不能为空或者同名记录已经存在!");
display.setCurrent(alert1);

}
FleshList();
}
}
}
class Hander3 implements CommandListener{
public void commandAction(Command c,Displayable d){
if(c==c7){
display.setCurrent(l);
}

}
}
class Hander4 implements CommandListener{
public void commandAction(Command c,Displayable d){
if(c==c10){


try{
baos=new ByteArrayOutputStream();
dos=new DataOutputStream(baos);
str1=tf6.getString();
if(str1.length()!=0){
da=rs.getRecord(id);
//str1=tf6.getString();
dos.writeUTF(str1);
str2=tf7.getString();
dos.writeUTF(str2);
str3=tf8.getString();
dos.writeUTF(str3);
str4=tf9.getString();
dos.writeUTF(str4);
str5=tf10.getString();
dos.writeUTF(str5);
da=baos.toByteArray();
rs.setRecord(id,da,0,da.length);
re.rebuild();
//FleshList();

display.setCurrent(l);

}
else
{alert1.setString("姓名不能为空!");
display.setCurrent(alert1);
}

FleshList();
}
catch(Exception e){
alert1.setString("修改失败!");
display.setCurrent(alert1);
}
}if(c==c9){
display.setCurrent(l);
}
}
}

class Hander5 implements CommandListener{
public void commandAction(Command c,Displayable da){
if(c==fc1){
display.setCurrent(l);
}
else if(c==fc2){
int cc=0;
int ccc=0;
int dd=l.size();

while(cc<(dd)){
if(l.getString(cc).equals(ftf1.getString())){
l.setSelectedIndex(cc,true);

try{
re.rebuild();
while(re.hasNextElement()){


da1=re.nextRecord();
if(l.getSelectedIndex()==ccc){

bais=new ByteArrayInputStream(da1);
dis=new DataInputStream(bais);
str1=dis.readUTF();
it1.setText(str1);
str2=dis.readUTF();
it2.setText(str2);
str3=dis.readUTF();
it3.setText(str3);
str4=dis.readUTF();
it4.setText(str4);
str5=dis.readUTF();
it5.setText(str5);
display.setCurrent(f2);
break;

}
ccc++;
}
}
catch(Exception e){
alert1.setString("数据库打开错误!");
display.setCurrent(alert1);
}
break;
}
cc++;
if(cc==dd){
alert1.setString("记录中不存在你所要查找的记录!");
display.setCurrent(alert1);
}
}
}
}
}



我暑假时写的一个RMS数据库存储删除添假修改查询(多列的)的小东东...这是核心代码.
dongdong715 2004-11-03
  • 打赏
  • 举报
回复
public void FleshList(){

int aaa=0;
int bbb=l.size();

while(aaa<(bbb)){


l.delete(0);


aaa++;

}

try{
re.rebuild();
while(re.hasNextElement()){

da=re.nextRecord();
bais=new ByteArrayInputStream(da);
dis=new DataInputStream(bais);
str1=dis.readUTF();
l.append(str1,null);

}
str1=null;
da=null;
re.rebuild();
}
catch(Exception e){}

}



class Hander1 implements CommandListener{
public void commandAction(Command c,Displayable d){
if(c==c1){
try{
rs.closeRecordStore();
re.destroy();
baos.close();
dos.close();
}catch(Exception e){
}
destroyApp(false);
notifyDestroyed();
}
else if(c==c2){

if(l.size()>=30)//判断记录是否已经超过30条,现在设置30条为上限! 可更改!
{
alert1.setString("记录已经满,不能再进行添加!");
display.setCurrent(alert1);
}
else
display.setCurrent(f);
}
else if(c==c11){
if(l.size()==0){
alert1.setString("数据库里没有记录,不能进行查看!");
display.setCurrent(alert1);
}
else{

try{
re.rebuild();
int a=l.getSelectedIndex();
// str6=l.getString(a);
// it3.setText(str6);


int count=0;

while(re.hasNextElement()){

da=re.nextRecord();



if(l.getSelectedIndex()==count){
// System.out.println(l.getSelectedIndex());
// System.out.println(count);
bais=new ByteArrayInputStream(da);
dis=new DataInputStream(bais);
str1=dis.readUTF();
it1.setText(str1);
str2=dis.readUTF();
it2.setText(str2);
str3=dis.readUTF();
it3.setText(str3);
str4=dis.readUTF();
it4.setText(str4);
str5=dis.readUTF();
it5.setText(str5);
display.setCurrent(f2);
// System.out.println("Dongdong");
break;

}
count++;



}
str1=null;
str2=null;
str3=null;
str4=null;
str5=null;
re.rebuild();
}
catch(Exception e){
alert1.setString("RMS数据库读取时产生错误!");
display.setCurrent(alert1);
}
}
// display.setCurrent(f2);



}
else if(c==c5){
if(l.size()==0){
alert1.setString("数据库里没有记录,不能进行修改!");
display.setCurrent(alert1);
}
else{

try{

re.rebuild();
int count2=0;
int b=l.getSelectedIndex();
while(re.hasNextElement()){
// da=re.nextRecord();

id=re.nextRecordId();
if(l.getSelectedIndex()==count2){
// System.out.println(id);
da=rs.getRecord(id);
bais=new ByteArrayInputStream(da);
dis=new DataInputStream(bais);
str1=dis.readUTF();
tf6.setString(str1);
str2=dis.readUTF();
tf7.setString(str2);
str3=dis.readUTF();
tf8.setString(str3);
str4=dis.readUTF();
tf9.setString(str4);
str5=dis.readUTF();
tf10.setString(str5);
display.setCurrent(f3);
break;
}
//System.out.println("I love you!");
count2++;
}
re.rebuild();
str1=null;
str2=null;
str3=null;
str4=null;
str5=null;
re.rebuild();
}
catch(Exception e){
alert1.setString("打开RMS数据库时产生错误!");
display.setCurrent(alert1);

}
}

}
UTF888 2004-10-29
  • 打赏
  • 举报
回复
3、数据的增加、修改及删除
·int addRecord(byte[] data , int offset , int numBytes)
将byte数组存放到数据仓储之中,并传回其Record ID
·int getRecord(int recordid , byte[] data , int offset)
取出特定Record ID的那笔数据
·byte[] getRecord(int recordid)
取出特定Record ID的那笔数据
·void setRecord(int recordid , byte[] newdata , int offset , int numBytes)
设定特定ID的数据
·void deleteRecord(int recordid)
删除特定ID的数据
!RecordStore类只提供写入byte数组的服务,写入非byte的数据类型时就比较麻烦,如下例:
---------------------------------------------------------------------------------------------
类:RMSUtil
import javax.microedition.rms.*;

public class RMSUtil {
public RMSUtil() {
}
//打开一个记录仓库,没有时创建
public static RecordStore openRMSAnyway(String rmsname) {
try {
RecordStore rs = RecordStore.openRecordStore(rmsname , true);
return rs;
}catch(Exception e) {}
return null;
}
//打开现有的记录仓库,没有时不创建
public static RecordStore openRMSExisted(String rmsname) {
try {
RecordStore rs = RecordStore.openRecordStore(rmsname , false);
return rs;
}catch(Exception e) {}
return null;
}
//删除现有的记录仓库
public static boolean deleteRMS(String rmsname) {
if(rmsname.length() > 32)
return false;
try {
RecordStore.deleteRecordStore(rmsname);
}catch(Exception e) {
return false;
}
return true;
}
//向记录仓库写入字符
public static int writeChar2RMS(RecordStore rs,char data) {
byte []tmp = new byte[2] ;
tmp[0] = (byte)(0xff&( data >> 8)) ;
tmp[1] = (byte)(0xff&( data >> 0)) ;
try {
return rs.addRecord(tmp,0,tmp.length) ;
}catch(Exception e){}
return -1 ;
}
//从记录仓库读取字符
public static char readChar4RMS(RecordStore rs,int recordid) {
byte []tmp = new byte[2] ;
try {
tmp = rs.getRecord(recordid) ;
}catch(Exception e) {}
char result = (char)(tmp[0]&0x00ff);
result = (char)((result << 8) + (char)(tmp[1]&0x00ff)) ;
return result ;
}
//向记录仓库写入整数型
public static int writeInt2RMS(RecordStore rs,int data) {
byte []tmp = new byte[4] ;
tmp[0] = (byte)(0xff&( data >> 24)) ;
tmp[1] = (byte)(0xff&( data >> 16)) ;
tmp[2] = (byte)(0xff&( data >> 8)) ;
tmp[3] = (byte)(0xff&( data >> 0)) ;
try {
return rs.addRecord(tmp,0,tmp.length) ;
}catch(Exception e) {}
return -1 ;
}
//从记录仓库读取整数型
public static int readInt4RMS(RecordStore rs,int recordid) {
byte []tmp = new byte[4] ;
try {
tmp = rs.getRecord(recordid) ;
}catch(Exception e) {}
int result = (tmp[0]&0x0000ff) ;
result = (result << 8) + (tmp[1]&0x000000ff) ;
result = (result << 8) + (tmp[2]&0x000000ff) ;
result = (result << 8) + (tmp[3]&0x000000ff) ;
return result ;
}
}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
类:MyMIDlet
........................
String dbname = "testdb";
Form f = new Form("testing");
RecordStore rs = RMSUtil.openRMSAnyway(dbname);
if(rs == null) {
f.append("Table open fail ...");
}else {
try {
int r1 = RMSUtil.writeChar2RMS(rs , 'H');
int r2 = RMSUtil.writeChar2RMS(rs , 'M');
int r3 = RMSUtil.writeInt2RMS(rs , 10000);
int r4 = RMSUtil.writeInt2RMS(rs , -9999);
f.append("" + RMSUtil.readInt4RMS(rs , r3));
f.append("" + RMSUtil.readChar4RMS(rs , r1));
f.append("" + RMSUtil.readChar4RMS(rs , r2));
f.append("" + RMSUtil.readInt4RMS(rs , r4));
rs.closeRecordStore();
RMSUtil.deleteRMS(dbname);
}catch(Exception e) {}
}
display.setCurrent(f);
UTF888 2004-10-29
  • 打赏
  • 举报
回复
2、记录仓库(RMS)的开启、关闭与删除
·RecordStore.openRecordStore()开启记录仓储,有三种方式
〓 第一种:四个参数
!第一个参数:String ,记录仓储的名称
!第二个参数:boolean ,true表示开启的记录仓储不存在,创建一个新的;false则抛出RecordStoreNofFoundException异常
!第三个参数:认证模式,读取权限;Record.AUTHMODE_PRIVATE(只有建立此仓储的MIDlet Suite才能存取这个仓储);Record.AUTHMODE_ANY(设备上任何MIDlet都可以读取记录)
!第四个参数:boolean ,写入权限
〓 第二种:三个参数(专门用来开启属于其它MIDlet Suite的记录仓储)
!第一个参数:记录仓储的名称
!第二个参数:MIDlet Suite供货商名称
〓 第三种:两个参数
!第一个参数:String ,记录仓储的名称
!第二个参数:boolean ,true表示开启的记录仓储不存在,创建一个新的;false则抛出RecordStoreNofFoundException异常
·RecordStore提供的setMode()方法用来改变记录仓储的认证模式及写入权(只有属于建立此仓库的NIDlet才能调用该方法)
·RecordStore提供了listRecordStores()函数,取得目前MIDlet所存在的MIDlet Suite之中所有记录仓储的名称,这些名称会以字符串数组的方式返回
·当记录仓储使用完毕后,必须使用RecordStore类的closeRecordStore()函数来关闭记录仓储,以释放资源
·如果不需要该记录仓储,使用RecordStore类的deleteRecordStroe()方法来删除该记录仓库;如果该记录仓库未处于关闭状态,则抛出RecordStoreException
·getLastModified()取得记录仓储的时间戳记
·getNextRecordID()取得Next Record ID的值
·getNumRecords()取得记录仓储之中记录的笔数
·getSize()取得目前记录仓储所占据的记忆空间
·getSizeAvailable()目前还有多少可用空间
·getVersion()取得版本号
UTF888 2004-10-29
  • 打赏
  • 举报
回复
1、javax.microedition.rms包含内容:
·类
RecordStore
·接口
RecordComparator
RecordEnumeration
RecordFilter
RecordListener
·异常
InvalidRecordIDException
RecordStoreException
RecordStoreFullException
RecordStoreNotFoundException
RecordStoreNotOpenException
supershan 2004-10-29
  • 打赏
  • 举报
回复
感谢各位DX的回复!以前在PDA上做过EVB的开发,数据库用的SQLSERVER CE,我想J2ME的发展,将来的很多应用也会用到移动数据库,在很多网站上已提到多种移动数据库,但应用的例子少之又少啊!
to mingjava: 你的程序我看过了,做的很不错。我想在手机上或移动设备做更多的处理,如果去扩展RMS,应该很累,也不方便,所以有现成的数据库,将事半功倍!
loverisyour 2004-10-29
  • 打赏
  • 举报
回复
刚来,学习!
mingjava 2004-10-28
  • 打赏
  • 举报
回复
www.j2medev.com里面有关于RMS得专题 讲解的比较清楚 在开放源码专区里面有一个我做的电话本 基于midp1.0得
cnesky 2004-10-28
  • 打赏
  • 举报
回复
public void save()
{
need_error_msg=true;
if( recordStore == null )
return;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream das = new DataOutputStream( baos );
try
{
for( int i = 0; i < N_SCORES; i++ )
{
das.writeInt( highScore[ i ] );
for(int j=0;j<NAME_SIZE;j++)
das.writeChar(names[i][j]);
}
das.writeInt(num_party);
}
catch( IOException ioe )
{
// System.out.println( "Can't save highScore "+ioe );
return;
}
byte[] b = baos.toByteArray();
try
{
if(recordStore.getNumRecords()>0)
recordStore.setRecord( 1, b, 0, b.length );
else
recordStore.addRecord( b, 0, b.length );
}
catch( RecordStoreException rse )
{
// System.out.println( "Unable to save the high score " + rse );
return;
}
need_error_msg=false;
}

这是我以前用过的一个存储最高记录的函数
Jim_OU 2004-10-28
  • 打赏
  • 举报
回复
只用过 RMS,标配应该只有这种数据库吧,看看外国有没有第三方手机数据库啦
不过我个人觉得,如果在手机上开发应用 RMS 足够拉,如果要用到关系数据库那么复杂,那他的手机一定要有 OS 系统了,要不然肯定很慢或者操作不方便,而那些类型的手机系统开发就不复杂啦
香芋元宇宙 2004-10-28
  • 打赏
  • 举报
回复
关注ing

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧