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中的xml解析

J2ME 中 .db 文件中的 RecordStore 名称更改和空值

在 J2me 中读写数据

J2ME,InputStream 在通过蓝牙接收 40K 数据后挂断

在 J2ME 中存储数据的文件