Lưu trữ dữ liệu, tài nguyên trong J2ME ?

tranhuyvc

Administrator
Staff member
21/1/10
6,248
231
63
Lưu trữ dữ liệu, tài nguyên trong J2ME ?

MIDP không sử dụng hệ thống file để lưu trữ dữ liệu.Thay vào đó MIDP lưu toàn bộ thông tin vào non-volatile memory (dung lượng vùng nhớ) bằng hệ thống lưu trữ gọi là Record Management System (RMS). Thế RMS là gì ?

RMS là hệ thống được tổ chức và quản lý dưới dạng các record (bản ghi). Mỗi bản ghi có thể chứa bất kỳ loại dữ liệu nào:kiểu số nguyên, chuỗi ký tự, một ảnh và kết quả của một Record là một chuỗi (mảng) các byte. Nếu bạn mã hoá dữ liệu của bạn dưới dạng nhị phân (binary), bạn có thể lưu trữ dữ liệu bằng Record sau đó đọc dữ liệu từ Record và khôi phục lại dữ liệu ban đầu. Kích thước dữ liệu không được vuợt quá giới hạn qui định của thiết bị di động. RMS lưu dữ liệu gần như một cơ sở dữ liệu, bao gồm nhiều dòng, mỗi dòng lại có một số định danh duy nhất.
Một tập các bản ghi(RecordStore) là tập hợp các Record được sắp xếp có thứ tự. Mỗi Record không thể đứng độc lập mà nó phải thuộc vào một RecordStore nào đó, các thao tác trên Record phải thông qua RecordStore chứa nó. Khi tạo ra một Record trong RecordStore, Record được gán một số định danh kiểu số nguyên gọi là Record ID. Record đầu tiên được tạo ra sẽ được gán Record ID là 1,sẽ tăng thêm 1 cho các Record tiếp theo. Record ID không là chỉ mục (index), các thao tác xóa Record trong RecordStore sẽ không tính toán lại các Record ID của các Record hiện có cũng không thay đổi Record ID của các Record được tạo mới, ví dụ: xóa record id 3, thêm một record mới sẽ có id là 4. Data là một dãy các byte đại diện cho dữ liệu cần lưu. Tên được dung để phân biệt các RecordStore trong bộ các MIDlet (MIDlet suite). MIDlet suite là tập các MIDlet có chung không gian tên (name space), chia sẻ cùng tài nguyên (như RecordStore), các biến tĩnh (static variable) trong các lớp và các MIDlet này sẽ được đóng gói trong cùng một file khi triển khai. Nếu ứng dụng của bạn chỉ có một MIDlet thì các RecordStore được sử dụng cũng phân biệt lẫn nhau bằng các tên. Tên của RecordStore có thể dài đến 32 ký tự Unicode và là duy nhất trong một MIDlet suite.


Tuy nhiên vẫn còn nhiều hạn chế :
Hạn chế về khả năng lưu trữ của thiết bị di động : Dung lượng vùng nhớ (non-volatile memory) dành riêng cho việc lưu trữ dữ liệu trong RMS thay đổi tùy theo thiết bị di động. Đặc tả MIDP yêu cầu rằng các nhà sản xuất thiết bị di động phải dành ra vùng nhớ có kích thước ít nhất 8K cho việc lưu trữ dữ liệu trong RMS. Đặc tả không nêu giới hạn trên cho mỗi Record. RMS cung cấp các API để xác định kích thước của mỗi Record, tổng dung lượng của RecordStore và kích thước còn lại của vùng nhớ này. Do đó trong quá trình phát triển các ứng dụng J2ME bạn phải cân nhắc trong việc sử dụng vùng nhớ này.
Tốc độ truy xuất dữ liệu :Các thao tác trên vùng nhớ này sẽ chậm hơn nhiều khi truy xuất dữ liệu trên bộ nhớ RAM. Giống như tốc độ đọc ổ cứng và tốc độ đọc từ RAM của máy tính. Trong kỹ thuật lập trình phải thường xuyên cache dữ liệu và các thao tác liên quan đến RMS chỉ thực hiện tập trung một lần (lúc khởi động hay đóng ứng dụng).
Cơ chế luồng an toàn :Nếu RecordStore chỉ được sử dụng bởi một MIDlet, không phải lo lắng vì RMS sẽ dành riêng một Thread để thực hiện các thao tác trên RecordStore. Tuy nhiên nếu có nhiều MIDlet và Thread cùng chia sẻ một RecordStore thì phải chú ý đến kỹ thuật lập trình Thread để đảm bảo không có sự xung đột dữ liệu

------------
Trong bài viết này Huy sẽ hướng dẫn các bạn, cách đọc ghi chuổi vào ứng dụng, đây là một trong những cách đơn giản nhất. Sau khi đã tạo project xong, các bạn tạo một MIDLET mới, dán vào đoạn mạ sau, chúng ta sẽ tìm hiểu cách hoạt động của nó ở bên dưới .
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

import javax.microedition.midlet.*;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;

/**
* @author Tran Huy
*/
public class demo_RMI_congdongjava extends MIDlet {
RecordStore rs=null;
public void startApp() {
try {
rs=RecordStore.openRecordStore("TranHuy", true);
String chuoicanghi="Congdongjava noi giao luu cua nhung tin do Java va cong nghe";
//ghi
byte[] canghi=chuoicanghi.getBytes();
rs.addRecord(canghi, 0, canghi.length);
System.out.println("Ghi du lieu xong");
System.out.println("-----------------------");
System.out.println("Cac du lieu vua ghi vao la :");
for (int i = 1; i <= rs.getNumRecords(); i++) {
System.out.println(new String(rs.getRecord(i)));
}
rs.closeRecordStore();
System.out.println("-------------");
System.out.println("Thanh cong");
} catch (RecordStoreException ex) {
ex.printStackTrace();
}
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
}
Không giống như J2SE hàm Main là đầu vào cho mỗi chương trình, đối với J2ME thì phải có 3 phương thức tương ứng bất đầu, ngừng, kết thúc ứng dụng thì mới chạy được. Ở đây chúng ta chỉ thao tác với một MIDLET không có giao diện chỉ in thử trên giao điện IDE nên chỉ thao tác với hàm startApp() (đầu vào của ứng dụng).
rs=RecordStore.openRecordStore("TranHuy", true);
Có nghĩa là sẽ tạo ra một RecordStore (khái niệm giống như một bảng) có tên là TranHuy, giá trị boolean thứ 2 có nghĩa là sẽ tạo ra RecordStore có tên tương ứng này nếu chưa có trên MÍDLET. Dưới đây là kết quả sau khi chạy đoạn mã này !
 
  • Like
Reactions: Nguyenduyen

chuotfx

Member
4/4/10
365
25
18
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

bạn cho mình hỏi 1 cái

có nghĩa tất cã dữ liệu khi sữ dụng muốn addRecord thì mình phải đều đổi về kiểu Byte hết à

vì có nhiều kiểu như int,float...v..v.
 

tranhuyvc

Administrator
Staff member
21/1/10
6,248
231
63
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

Đúng đó bạn ơi vì dữ liệu trong RMS lưu dưới dạng byte mà, nếu là kiểu int, float... cũng bắt buộc chuyển vể byte hết
Thân
 

chuotfx

Member
4/4/10
365
25
18
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

Đúng đó bạn ơi vì dữ liệu trong RMS lưu dưới dạng byte mà, nếu là kiểu int, float... cũng bắt buộc chuyển vể byte hết
Thân
bạn có cách nào chuyển int,float về mãng byte[] nhanh kô,chứ mình làm hơi bị tốn công là từ int,float minh đổi sang String rùi String sang byte[]

vì vậy nên mình với hỏi:no:
 

nghiencuuJava

Member
18/3/10
216
0
16
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

nếu mềnh muốn tạo jao diện trên mobile rùi lưu dữ liệu lại thì mềnh fai làm như thế nào hả bạn Huy?

ví dụ như muốn lưu tên + số điện thoại ấy! hay như lưu lại tin nhắn ấy!
 

nghiencuuJava

Member
18/3/10
216
0
16
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

bạn có cách nào chuyển int,float về mãng byte[] nhanh kô,chứ mình làm hơi bị tốn công là từ int,float minh đổi sang String rùi String sang byte[]

vì vậy nên mình với hỏi:no:
bạn coi thử ở đây xem có jup bạn dc j ko nhé
http://mobilesprogramming.wordpress.com/2010/02/04/chuy%E1%BB%83n-d%E1%BB%95i-cac-ki%E1%BB%83u-d%E1%BB%AF-li%E1%BB%87u-nguyen-th%E1%BB%A7y-trong-java/
 

chuotfx

Member
4/4/10
365
25
18
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

mình xong cái này rùi,nếu đơn giản thì kô cần stream,còn chuyển nhiều loại dữ liệu thì dùng stream cho nhanh

Còn tạo giao diện mà lưu lại nó thì tội cho RMS,nó kô phải đa năng đâu bạn.
Còn lưu tên + số điện thoại thì khai báo 1 cái stream Byte rùi viết 2 cái đó vào,sau đó dùng phương thức có sẳn trong stream đó mà ghi vào Record,đơn giản hơn nhiều

Còn kô thì đỗi hết ra string bằng phương thức toString đó,rùi đổi tiếp sang Byte bằng phương thức getByte,rồi ghi vào,chậm mà chắc
 

paka

New Member
6/4/10
2
0
0
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

đề nghị các bạn đưa luôn code lên làm ví dụ đi
 

letrungdung1001

New Member
3/6/10
6
0
0
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

Hãy làm về polish nhiều hơn đi các Mem ơi.
 

quycanh

New Member
14/7/10
18
0
0
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

vậy em muốn hỏi em có thể Lưu lại 1 đoạn Text và lấy lại đoạn Text đó k ạ ?
(Em đang lập trình game )
 

quycanh

New Member
14/7/10
18
0
0
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

vậy em muốn hỏi em có thể Lưu lại 1 đoạn Text và lấy lại đoạn Text đó k ạ ?
(Em đang lập trình game )
 

quycanh

New Member
14/7/10
18
0
0
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

Anh Admin ơi !
Em muốn duyệt 1 mảng ( các chữ số ) rồi sau đó lưu lại.
Thoát khỏi ứng dụng, vào ứng dụng thì em sẽ Load lại mảng đó lên màn hình, như vậy có đc k ạ ?
 

chuotfx

Member
4/4/10
365
25
18
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

Anh Admin ơi !
Em muốn duyệt 1 mảng ( các chữ số ) rồi sau đó lưu lại.
Thoát khỏi ứng dụng, vào ứng dụng thì em sẽ Load lại mảng đó lên màn hình, như vậy có đc k ạ ?
có 2 loại mãng 1 chiều và 2 chiều
nếu 1 chiều thì đơn giản,2 chiều thì biến đổi thành 1 chiêu ( cái này trên mạng có )

vì tất cã dữ liệu dạng j cũng đc lưu trữ bằng byte,nên bạn cứ chuyển hết thành byte rồi lưu vào RMS

vấn đề load lại thì chỉ cần lúc đầu là kiểu j thì chuyển ngược thành kiểu đó
==============
hoặc bạn dùng lưu dữ liệu vào stream,rồi vào RMS,sau đó lấy từ RMS vào stream,sau đó phục hồi lại đc

======
đây là 1 ví dụ lưu stream( dùng cách này tiện hơn,mà lưu nhiều loại,phục hồi lại cũng khỏe)
PHP:
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.*;
public class ReadWriteStreams extends MIDlet
{
        private RecordStore rs = null; // Record store
        static final String REC_STORE = "db_1"; // Name of record store
        public ReadWriteStreams()
        {
                openRecStore(); // Create the record store
                writeTestData(); // Write a series of records
                readStream(); // Read back the records
                closeRecStore(); // Close record store
                deleteRecStore(); // Remove the record store
        }
        public void destroyApp( boolean unconditional )
        {
        }
        public void startApp()
        {
                // There is no user interface, go ahead and shutdown
                destroyApp(false);
                notifyDestroyed();
        }
        public void pauseApp()
        {
        }
        public void openRecStore()
        {
                try
                {
                // Create record store if it does not exist
                        rs = RecordStore.openRecordStore(REC_STORE, true );
                }
                catch (Exception e)
                {
                        db(e.toString());
                }
        }
        public void closeRecStore()
        {
                try
                {
                        rs.closeRecordStore();
                }
                catch (Exception e)
                {
                        db(e.toString());
                }
        }
        public void deleteRecStore()
        {
                if (RecordStore.listRecordStores() != null)
                {
                        try
                        {      
                                RecordStore.deleteRecordStore(REC_STORE);
                        }
                        catch (Exception e)
                        {
                                db(e.toString());
                        }
                }
        }
        /*--------------------------------------------------
        * Create three arrays to write to record store
        *-------------------------------------------------*/
        public void writeTestData()
        {
                String[] strings = {"Text 1", "Text 2"};
                boolean[] booleans = {false, true};
                int[] integers = {1 , 2};
                writeStream(strings, booleans, integers);
        }
        /*--------------------------------------------------
        * Write to record store using streams.
        *-------------------------------------------------*/
        public void writeStream(String[] sData, boolean[] bData,int[] iData)
        {
                try
                {
                        // Write data into an internal byte array
                        ByteArrayOutputStream strmBytes =
                        new ByteArrayOutputStream();
                        // Write Java data types into the above byte array
                        DataOutputStream strmDataType =
                        new DataOutputStream(strmBytes);
                        byte[] record;
                        for (int i = 0; i < sData.length; i++)
                        {
                                // Write Java data types
                                strmDataType.writeUTF(sData[i]);
                                strmDataType.writeBoolean(bData[i]);
                                strmDataType.writeInt(iData[i]);
                                // Clear any buffered data
                                strmDataType.flush();
                                // Get stream data into byte array and write record
                                record = strmBytes.toByteArray();
                                rs.addRecord(record, 0, record.length);
                                // Toss any data in the internal array so writes
                                // starts at beginning (of the internal array)
                                strmBytes.reset();
                        }
                        strmBytes.close();
                        strmDataType.close();
                }
                catch (Exception e)
                {
                        db(e.toString());
                }
        }
        /*--------------------------------------------------
        * Read from the record store using streams
        *-------------------------------------------------*/
        public void readStream()
        {
                try
                {
                        // Careful: Make sure this is big enough!
                        // Better yet, test and reallocate if necessary
                        byte[] recData = new byte[50];
                        // Read from the specified byte array
                        ByteArrayInputStream strmBytes =
                        new ByteArrayInputStream(recData);
                        // Read Java data types from the above byte array
                        DataInputStream strmDataType =
                        new DataInputStream(strmBytes);
                        for (int i = 1; i <= rs.getNumRecords(); i++)
                        {
                                // Get data into the byte array
                                rs.getRecord(i, recData, 0);
                                // Read back the data types
                                System.out.println("Record #" + i);
                                System.out.println("UTF: " + strmDataType.readUTF());
                                System.out.println("Boolean: " + strmDataType.readBoolean());
                                System.out.println("Int: " + strmDataType.readInt());
                                System.out.println("--------------------");
                                // Reset so read starts at beginning of array
                                strmBytes.reset();
                        }
                        strmBytes.close();
                        strmDataType.close();
                }
                catch (Exception e)
                {
                        db(e.toString());
                }
        }
        /*--------------------------------------------------
        * Simple message to console for debug/errors
        * When used with Exceptions we should handle the
        * error in a more appropriate manner.
        *-------------------------------------------------*/
        private void db(String str)
        {
                System.err.println("Msg: " + str);
        }
}
 

japanese1801

New Member
14/11/11
4
0
0
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

ban ơi!
cho mình hỏi tí!
mình đang làm đồ án về tra cứu động từ bất quy tắc!
bn chỉ cho mình cách lưu trữ dl đi
vì dl rất nhiều
mình ko biết làm sao hết
jup mình với nha
 

japanese1801

New Member
14/11/11
4
0
0
Ðề: Lưu trữ dữ liệu, tài nguyên trong J2ME ?

ban ơi!
cho mình hỏi tí!
mình đang làm đồ án về tra cứu động từ bất quy tắc!
bn chỉ cho mình cách lưu trữ dl đi
vì dl rất nhiều
mình ko biết làm sao hết
jup mình với nha