J2ME 中的数据库
Posted
技术标签:
【中文标题】J2ME 中的数据库【英文标题】:Database in J2ME 【发布时间】:2012-07-23 04:31:58 【问题描述】:我是 J2ME 的新手。
在我的应用程序中,我想在记录存储中添加多条记录,并且还想访问它。
如何在记录存储中添加多个记录以及如何访问它?
【问题讨论】:
【参考方案1】:这是我的RMS库代码,学习一下,很容易实现,insert、updated、delete等方法都有。
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreFullException;
import javax.microedition.rms.RecordStoreNotOpenException;
import com.project.gui.components.CustomAlert;
import com.project.gui.midlet.MyMidlet;
public class RMSStore
private RecordStore rs = null;
public void openRecordStore(String str)
try
if(rs == null)
rs = RecordStore.openRecordStore(str, true);
catch (Exception e)
e.printStackTrace();
public void closeRecordStore()
try
if(rs!=null)
rs.closeRecordStore();
catch (Exception e)
e.printStackTrace();
public void deleteRecordStore(String storenName)
try
RecordStore.deleteRecordStore(storenName);
catch (Exception e)
e.printStackTrace();
public void deleteRMS(String storenName)
int count = 0;
try
RecordStore newRS = RecordStore.openRecordStore(storenName, true);
count = newRS.getNumRecords();
newRS.closeRecordStore();
catch ( Exception e )
System.out.println ( "Error while Opening " + e.toString() );
if ( count > 0 )
try
RecordStore.deleteRecordStore(storenName);
catch (Exception e)
e.printStackTrace();
public static String[] listAllRecordStore ()
return RecordStore.listRecordStores();
public boolean SearchRecord(String Rec)
String [] data = getRecordData();
for ( int i = 0 ; i < data.length ; i++ )
if ( Rec.toString().trim().equals(data[i].toString().trim()) )
data = null; // System.gc();
return true;
data = null; // System.gc();
return false;
public boolean SearchRecord(String Rec, int pos )
String [] data = getRecordData();
Rec = Rec.substring(0,pos);
for ( int i = 0 ; i < data.length ; i++ )
data[i] = data[i].substring(0, pos );
if ( Rec.toString().trim().equals(data[i].toString().trim()) )
data = null; // System.gc();
return true;
data = null; // System.gc();
return false;
public int getCurrentRecordID ( RMSStore rmsTable, String Rec )
RecordEnumeration re = null;
try
re = rmsTable.getRecordEnumData();
while ( re.hasNextElement() )
int id = re.nextRecordId();
String record = rmsTable.getRecordFromId(id);
if ( record.indexOf(Rec) != -1 )
return id;
catch ( Exception e ) System.out.println ( "getCurrentRecordID Error:" + e.toString() );
return -1;
public int writeRecord(String str)
int id = 0;
try
id = rs.addRecord(str.getBytes(), 0, str.getBytes().length);
catch (RecordStoreFullException e)
CustomAlert memoryFullAlert = new CustomAlert("");
memoryFullAlert.setString("Memory Full");
MyMidlet.getDisplay().setCurrent(memoryFullAlert);
catch (Exception e)
e.printStackTrace();
return id;
public int writeByteRecord(byte[] data)
int id = -1;
try
id = rs.addRecord(data, 0, data.length);
catch (RecordStoreFullException e)
e.printStackTrace();
CustomAlert memoryFullAlert = new CustomAlert("");
memoryFullAlert.setString("Memory Full");
MyMidlet.getDisplay().setCurrent(memoryFullAlert);
catch (Exception e)
e.printStackTrace();
return id;
public int getRecordCount()
try
return rs.getNumRecords();
catch (Exception e)
e.printStackTrace();
return 0;
public byte[] getRecordDataFromId(int id)
byte[] data = null;
try
data = rs.getRecord(id);
catch (Exception e)
e.printStackTrace();
return data;
public String getRecordFromId(int id)
return new String(getRecordDataFromId(id));
public byte[] getRecordByteFromId(int id)
return getRecordDataFromId(id);
public void deleteRecord(int id)
try
rs.deleteRecord(id);
catch (Exception e)
e.printStackTrace();
public boolean checkRecordExists(String compare)
for(int i = 0; i < getRecordCount(); i++)
if(compare.equals(getRecordFromId(i + 1)))
return true;
return false;
public int getMaxRMSSize()
int size = 0;
try
size = rs.getSizeAvailable() + rs.getSize();
catch (RecordStoreNotOpenException e)
e.printStackTrace();
return size;
public void setRecordById(String str, int id)
try
rs.setRecord(id, str.getBytes(), 0, str.getBytes().length);
catch (Exception e)
e.printStackTrace();
public int getNextRecordId()
int id = 0;
try
id = rs.getNextRecordID();
catch (Exception e)
e.printStackTrace();
return id;
public RecordEnumeration getRecordEnumData ()
try
return rs.enumerateRecords(null, null, false);
catch (Exception e)
e.printStackTrace();
return null;
public String [] getRecordData()
String[] str = null;
int counter = 0;
try
RecordEnumeration enumeration = rs.enumerateRecords(null, null, false);
str = new String[rs.getNumRecords()];
while(enumeration.hasNextElement())
try
str[counter] = (new String(enumeration.nextRecord()));
counter ++;
catch (Exception e)
e.printStackTrace();
catch (Exception e)
e.printStackTrace();
return str;
【讨论】:
先生。 Lucifer,请提供 CustomAlert 和 MyMidlet 文件,以便我直观理解。【参考方案2】:RMS 是一种基于记录的数据存储机制,因此您可以非常轻松地存储多条记录,请参阅以下博客了解 RMS 的工作原理。
http://www.ibm.com/developerworks/library/wi-rms/
【讨论】:
非常感谢jeet。它帮助了我。但是仍然出现一个问题,当我关闭模拟器时,数据库也被删除了。有什么解决方案吗? 你用的是eclipse还是netbeans? 我正在使用 netbeans IDE 7.1.2 进行 j2me 开发。 在netbeans和eclipse上会出现关闭模拟器时数据可能会被破坏的情况,建议你在真机上试一试,它会正常工作的。以上是关于J2ME 中的数据库的主要内容,如果未能解决你的问题,请参考以下文章
J2ME RecordStore 中的数据不会跨会话保持不变
J2ME 中 .db 文件中的 RecordStore 名称更改和空值