Record Store Discovery
Äã¿ÉÒÔͨ¹ýµ÷ÓÃRecordStore.listRecordStores()À´µÃµ½MIDlet suitesÖеÄRecord Store,Õâ¸ö¾²Ì¬·½·¨·µ»ØÒ»¸öStringÀàÐ͵ÄÊý×飬ÿ¸ö´ú±íRecord StoreµÄÃû×Ö£¬Èç¹ûûÓÐrecord StoreÄÇô»á·µ»Ønull,·½·¨RMSAnalyzer.annlyzeAll()ͨ¹ýµ÷ÓÃlistRecordStores()µÃµ½Record StoreÈ»ºóͨ¹ý·½·¨analyze()·ÖÎöÿ¸öRecord Store.
public void analyzeAll(){
String[] names = RecordStore.listRecordStores();
for( int i = 0;
names != null && i < names.length;
++i ){
analyze( names[i] );
}
}
×¢Òâµ½ÁгöµÄÊý×éÃû×ÖÊÇËùÊôMIDlet suiteµÄRecord Store¡£MIDPÖÐûÓÐÌṩÁоٳöÈÎºÎÆäËûMIDlet suitesµÄRecord StoreµÄ·½·¨£¬ÔÚMIDP 1.0ÖÐRecord StoreÔÚËùÊôMIDlet suitesÍâÊDz»¿É¼ûµÄ£¬ÔÚMIDP 2.0ÖУ¬MIDlet suite¿ÉÒÔÖ¸¶¨Ò»¸öRecord Store×÷Ϊ¿É¹²ÏíµÄ£¬µ«ÊÇÆäËûµÄsuiteÒªÖªµÀËûµÄÃû×ֲſÉÒÔ·ÃÎÊËü¡£
Opening and closing Record Store
RecordStore.openRecordStore()ÊÇÓÃÀ´´ò¿ªÒ»¸öRecord StoreµÄ£¬ËüÒ²¿ÉÒÔÓÃÀ´´´½¨Ò»¸öRecord Store£¬Õâ¸ö¾²Ì¬·½·¨·µ»ØÒ»¸öRecord StoreµÄ¶ÔÏó£¬ÏÂÃæÊÇRMSAnalyzer.analyze()¡£
public void analyze( String rsName ){
RecordStore rs = null;
try {
rs = RecordStore.openRecordStore( rsName, false );
analyze( rs ); // call overloaded method
} catch( RecordStoreException e ){
logger.exception( rsName, e );
} finally {
try {
rs.closeRecordStore();
} catch( RecordStoreException e ){
// Ignore this exception
}
}
}
openRecordStore()µÄµÚ¶þ¸ö²ÎÊý±íʾÈç¹ûrecord store²»´æÔÚÊDz»ÊÇ´´½¨Ðµģ¬ÔÚMIDP2.0ÖУ¬Èç¹ûÄãÏë´ò¿ªÒ»¸öÔÚÆäËûµÄMIDlet suiteÀïÃæ´´½¨µÄRecord StoreµÄ»°Ó¦¸ÃÓÃÏÂÃæµÄ·½·¨¡£
...
String name = "mySharedRS";
String vendor = "EricGiguere.com";
String suite = "TestSuite";
RecordStore rs =
RecordStore.openRecordStore( name, vendor, suite );
...
vendorºÍsuiteµÄÃû×ÖÓ¦¸ÃºÍMIDlet suiteµÄmanifestºÍjadµÄÄÚÈÝÒ»Ö¡£
µ±ÄãÍê³ÉÁ˶Ôrecord storeµÄ²Ù×÷ÒÔºóÓ¦¸Ãµ÷ÓÃRecordStore.closeRecordStore()À´¹Ø±ÕËü£¬Ò»¸öRecordStoreµÄʵÀýÔÚÒ»¸öMIDlet suiteÀïÃæÊÇΨһµÄ£¬Èç¹ûÒÔͬÑùµÄÃû×ÖÔٴε÷ÓÃopenRecordStore()µÄ»°»á·µ»ØÍ¬ÑùµÄʵÀý£¬ÕâÑù¶à¸öMIDletÔÚ¹²ÏíÒ»¸örecord store£¬Ã¿¸örecord store»á¸ú×ÙËü±»´ò¿ªµÄ´ÎÊý£¬Õâ¸örecord storeÖ±µ½±»µ÷ÓÃÏàͬ´ÎÊýµÄcloseRecordStore()ºó²Å»á³¹µ×µÄ¹Ø±Õ£¬¶ÔÒ»¸öÒѾ¹Ø±ÕµÄRecord Store½øÐвÙ×÷»áµ¼ÖÂÅ׳ö
RecordStoreNotOpenException¡£
Creating Record Store
´´½¨Ò»¸ö˽ÓеÄrecord store£¬°ÑµÚ¶þ¸ö²ÎÊýÉèÖÃΪtrueµ÷ÓÃopenRecordStore()£¬...
// Create a record store
RecordStore rs = null;
try {
rs = RecordStore.openRecordStore( "myrs", true );
} catch( RecordStoreException e ){
// couldn't open it or create it
}
Èç¹ûÒª´´½¨Ò»¸ö¿É¹²ÏíµÄrecord store£¬ÄÇôʹÓÃËĸö²ÎÊý±äÁ¿µÄopenRecordStore()
int authMode = RecordStore.AUTHMODE_ANY;
boolean writable = true;
rs = RecordStore.openRecordStore( "myrs", true,
authMode, writable );
µ±µÚ¶þ¸ö²ÎÊýÊÇtrue²¢ÇÒrecord store²»´æÔÚµÄʱºò£¬ºóÃæÁ½¸ö²ÎÊý¿ØÖÆËûµÄÊÚȨģʽºÍ¿ÉдÐÔ£¬ÊÚȨģʽ¾ö¶¨ÊÇ·ñÆäËûµÄMIDlet suite¾ßÓзÃÎÊrecord storeµÄȨÏÞ£¬Á½ÖÖ¿ÉÄܵÄģʽÊÇRecordStore.AUTHMODE_PRIVATE(Ö»ÓÐÓµÓеÄSUITE²Å¿ÉÒÔ·ÃÎÊ)ºÍRecordStore.AUTHMODE_ANY£¨ÈκÎsuite¶¼¿ÉÒÔ·ÃÎÊ£©£¬¿ÉдÐÔ¿ØÖÆ×ÅÊÇ·ñÆäËûµÄsuiteÄܹ»ÐÞ¸Ärecord store£¬Èç¹ûfalseµÄ»°£¬ÄÇôֻÓÐËùÊôsuite²Å¿ÉÒÔÐ޸쬯äËûµÄÖ»ÄܶÁÈ¡¡£×¢ÒâËùÊôsuite¿ÉÒÔÔÚÈκÎʱºòµ÷ÓÃRecordStore.setMode()À´ÐÞ¸ÄËüµÄÊÚȨºÍ¶Áдģʽ£¬ÀýÈ磺
rs.setMode( RecordStore.AUTHMODE_ANY, false );ÊÂʵÉÏ×îºÃÊÇ´´½¨Ò»¸örecord store,ÊÚȨģʽΪRecordStore.AUTHMODE_PRIVATE¡£
Adding and updating records
¼Ç¼¾ÍÊÇ×Ö½ÚÊý×飬Äã¿ÉÒÔͨ¹ýµ÷ÓÃRecordStore.addRecord()À´Ìí¼ÓÒ»¸öеļǼµ½Ò»¸ö´ò¿ªµÄRecord Store
byte[] data = new byte[]{ 0, 1, 2, 3 };
int recordID;
recordID = rs.addRecord( data, 0, data.length );
Èç¹ûµÚÒ»¸ö²ÎÊýÊÇnullµÄ»°£¬ÄÇôÄã¾ÍÄÜÌí¼ÓÒ»¸ö¿Õ¼Ç¼¡£µÚ¶þ¸öºÍµÚÈý¸ö²ÎÊý˵Ã÷ÁË×Ö½ÚÊý×éµÄÆðµãºÍ´ÓÆðµã¿ªÊ¼µÄ×ܵÄ×Ö½ÚÊý¡£Èç¹ûÌí¼Ó³É¹¦»á·µ»ØÐ¼Ç¼µÄrecord ID,Èç¹ûʧ°Ü»áÅ׳öÒì³££¬ÀýÈçRecordStoreFullException¡£
ͨ¹ýµ÷ÓÃRecordStore.setRecord()¿ÉÒÔÔÚÈκÎʱºò¸üмǼµÄÄÚÈÝ¡£
int recordID = ...; // some record ID
byte[] data = new byte[]{ 0, 10, 20, 30 };
rs.setRecord( recordID, data, 1, 2 );
// replaces all data in record with 10, 20
Äã²»ÄÜ´ó¿éµÄÌí¼Ó¼Ç¼£¬±ØÐëÊ×ÏȰѼǼת»»³ÉÊý×飬Ȼºóµ÷ÓÃÌí¼ÓµÄº¯Êý£¬Í¨¹ýµ÷ÓÃRecordStore.getNextRecordID()Äã¿ÉÒԵõ½Ï´ε÷ÓÃaddRecord()½«ÒªµÃµ½µÄrecord ID,Õâ¸öÖµ±ÈÏÖÔÚʹÓõÄÈκÎÖµ¶¼´ó¡£
Reading records
ÏëÒª¶ÁÈ¡¼Ç¼£¬ÓÐÁ½ÖÖ·½·¨¡£µÚÒ»ÊÇ·ÖÅäºÏÊÊ´óСµÄÊý×éÈ»ºó°Ñ¼Ç¼µÄÄÚÈݸ´ÖƹýÈ¥¡£
int recordID = .... // some record ID
byte[] data = rs.getRecord( recordID );
µÚ¶þÖÖ·½·¨ÊǰÑÊý×鏴֯µ½Ô¤ÏÈ·ÖÅäµÄ×Ö½ÚÊý×éÖУ¬Ö¸¶¨¸´ÖÆµÄÆðµã²¢·µ»Ø¸´ÖƵÄ×Ö½ÚÊýÄ¿¡£
int recordID = ...; // some record ID
byte[] data = ...; // an array
int offset = ...; // the starting offset
int numCopied = rs.getRecord( recordID, data, offset );
Êý×éµÄ´óС±ØÐëÄÜ×ã¹»ÈÝÄÉÊý¾Ý£¬·ñÔò»áÅ׳öjava.lang.ArrayIndexOutOfBoundsException.ʹÓÃRecordStore.getRecordSize()À´·ÖÅäÊý×é¿Õ¼äÊǺÏÊʵķ½·¨¡£ÊÂʵÉϵÚÒ»¸ö·½·¨µÈ¼ÛÓë
byte[] data = new byte[rs.getRecordSize(recordID)];
rs.getRecord(recordID,data,0);
µÚ¶þÖÖ·½·¨ÓÐÀûÓÚ¼õСÄÚ´æµÄ·ÖÅ䣬µ±ÄãÒª±éÀúÒ»×é¼Ç¼µÄʱºò£¬Äã¿ÉÒÔ½áºÏgetNextRecordID()ºÍgetRecordSize()À´Íê³ÉÔËËãÁ¿ºÜ´óµÄËÑË÷¡£
int nextID = rs.getNextRecordID();
byte[] data = null;
for( int id = 0; id < nextID; ++id ){
try {
int size = rs.getRecordSize( id );
if( data == null || data.length < size ){
data = new byte[ size ];
}
rs.getRecord( id, data, 0 );
processRecord( rs, id, data, size ); // process it
} catch( InvalidRecordIDException e ){
// ignore, move to next record
} catch( RecordStoreException e ){
handleError( rs, id, e ); // call an error routine
}
}
¸üºÃµÄ°ì·¨ÊÇʹÓÃRecordStore.enumerateRecords()À´±éÀú¼Ç¼¡£
Deleting Records and Record Stores
Äã¿ÉÒÔͨ¹ýµ÷ÓÃRecordStore.deleteRecord()À´É¾³ý¼Ç¼
int recordID = ...; // some record ID
rs.deleteRecord( recordID );
Ò»µ©¼Ç¼±»É¾³ý£¬ÈκζԼǼµÄ²Ù×÷½«»áµ¼ÖÂÅ׳öInvalidRecordIDException£¬Í¨¹ýµ÷ÓÃRecordStore.deleteRecordStore()À´É¾³ýRecord Store.
try {
RecordStore.deleteRecordStore( "myrs" );
} catch( RecordStoreNotFoundException e ){
// no such record store
} catch( RecordStoreException e ){
// somebody has it open
}
Record StoreÖ»ÄÜÔÚûÓдò¿ªµÄʱºò±»ËùÊôµÄsuiteµÄMIDletɾ³ý¡£
ÆäËû²Ù×÷
getLastModified()·µ»Ø×îºóÐÞ¸Ärecord storeµÄʱ¼ä£¬¸ñʽºÍSystem.currentTimeMillis()Ò»Ñù¡£
getName()µÃµ½record storeµÄÃû×Ö¡£
getNumRecords()·µ»Ørecord storeÖмǼµÄÊýÁ¿¡£
getSize()·µ»Ørecord storeµÄÕû¸ö´óС£¬°üÀ¨¼Ç¼µÄ´óСºÍϵͳÀ´ÊµÏÖrecord storeµÄ¿Õ¼ä¡£
getSizeAvailable()·µ»Ørecord storeÖл¹ÄÜÓõĿռ䣬
getVersion()·µ»Ørecord storeµÄ°æ±¾Êý£¬Õâ¸öÊý´óÓÚ0£¬Ã¿´Îrecord store±»Ð޸ģ¬Õâ¸öÊý¶¼»á×Ô¶¯Ôö¼Ó¡£
Ò»¸öMIDletÄܹ»Í¨¹ý×¢²áÒ»¸ö¼àÌýÆ÷À´¸ú×Ùrecord store,ͨ¹ýaddRecordListener()ºÍdeleteRecordListener()¡£
The RMSAnalyzer class
×îºóÎÒÃÇÌṩһ¸ö·ÖÎörecord storeµÄÀ࣬Äã¿ÉÒÔÕâÑùʹÓÃËü¡[/!--empirenews.page--]£
RecordStore rs = ...; // open the record store
RMSAnalyzer analyzer = new RMSAnalyzer();
analyzer.analyze( rs );
ͨ³£·ÖÎöÊä³öµ½System.out£¬ÑùʽÈçÏÂËùʾ£º
=========================================
Record store: recordstore2
Number of records = 4
Total size = 304
Version = 4
Last modified = 1070745507485
Size available = 975950
Record #1 of length 56 bytes
5f 62 06 75 2e 6b 1c 42 58 3f _b.u.k.BX?
1e 2e 6a 24 74 29 7c 56 30 32 ..j$t)|V02
5f 67 5a 13 47 7a 77 68 7d 49 _gZ.Gzwh}I
50 74 50 20 6b 14 78 60 58 4b PtP k.x`XK
1a 61 67 20 53 65 0a 2f 23 2b .ag Se./#+
16 42 10 4e 37 6f .B.N7o
Record #2 of length 35 bytes
22 4b 19 22 15 7d 74 1f 65 26 "K.".}t.e&
4e 1e 50 62 50 6e 4f 47 6a 26 N.PbPnOGj&
31 11 74 36 7a 0a 33 51 61 0e 1.t6z.3Qa.
04 75 6a 2a 2a .uj**
Record #3 of length 5 bytes
47 04 43 22 1f G.C".
Record #4 of length 57 bytes
6b 6f 42 1d 5b 65 2f 72 0f 7a koB.[e/r.z
2a 6e 07 57 51 71 5f 68 4c 5c *n.WQq_hL
1a 2a 44 7b 02 7d 19 73 4f 0b .*D{.}.sO.
75 03 34 58 17 19 5e 6a 5e 80 u.4X..^j^?
2a 39 28 5c 4a 4e 21 57 4d 75 *9(JN!WMu
80 68 06 26 3b 77 33 ?h.&;w3
Actual size of records = 153
-----------------------------------------
ÕâÖÖÑùʽ·½±ãÔÚwtkÖÐÏÔʾ£¬ÔÚʵ¼ÊµÄÉ豸ÖнøÐвâÊÔµÄʱºò£¬Äã¿ÉÄÜÏ£Íû°Ñ·ÖÎöÊä³öµ½´®¿Ú»òÕßͨ¹ýÍøÂç·¢µ½servlet£¬Äã¿ÉÒÔͨ¹ý¶¨Òå×Ô¼ºµÄÀàʵÏÖʵÏÖLogger½Ó¿Ú£¬È»ºó°ÑÕâ¸öÀà×÷ΪRMSAnalyzer¹¹ÔìÆ÷µÄ²ÎÊý¡£ÏÂÃæÊÇÔ´´úÂë¡£
package com.ericgiguere;
import java.io.*;
import javax.microedition.rms.*;
// Analyzes the contents of a record store.
// By default prints the analysis to System.out,
// but you can change this by implementing your
// own Logger.
public class RMSAnalyzer {
// The logging interface.
public interface Logger {
void logEnd( RecordStore rs );
void logException( String name, Throwable e );
void logException( RecordStore rs, Throwable e );
void logRecord( RecordStore rs, int id,
byte[] data, int size );
void logStart( RecordStore rs );
}
private Logger logger;
// Constructs an analyzer that logs to System.out.
public RMSAnalyzer(){
this( null );
}
// Constructs an analyzer that logs to the given logger.
public RMSAnalyzer( Logger logger ){
this.logger = ( logger != null ) ? logger :
new SystemLogger();
}
// Open the record stores owned by this MIDlet suite
// and analyze their contents.
public void analyzeAll(){
String[] names = RecordStore.listRecordStores();
for( int i = 0;
names != null && i < names.length;
++i ){
analyze( names[i] );
}
}
// Open a record store by name and analyze its contents.
public void analyze( String rsName ){
RecordStore rs = null;
try {
rs = RecordStore.openRecordStore( rsName, false );
analyze( rs );
} catch( RecordStoreException e ){
logger.logException( rsName, e );
} finally {
try {
rs.closeRecordStore();
} catch( RecordStoreException e ){
// Ignore this exception
}
}
}
// Analyze the contents of an open record store using
// a simple brute force search through the record store.
public synchronized void analyze( RecordStore rs ){
try {
logger.logStart( rs );
int lastID = rs.getNextRecordID();
int numRecords = rs.getNumRecords();
int count = 0;
byte[] data = null;
for( int id = 0;
id < lastID && count < numRecords;
++id ){
try {
int size = rs.getRecordSize( id );
// Make sure data array is big enough,
// plus add some for growth
if( data == null || data.length < size ){
data = new byte[ size + 20 ];
}
rs.getRecord( id, data, 0 );
logger.logRecord( rs, id, data, size );
++count; // only increase if record exists
}
catch( InvalidRecordIDException e ){
// just ignore and move to the next one
}
catch( RecordStoreException e ){
logger.logException( rs, e );
}
}
} catch( RecordStoreException e ){
logger.[/!--empirenews.page--]logException( rs, e );
} finally {
logger.logEnd( rs );
}
}
// A logger that outputs to a PrintStream.
public static class PrintStreamLogger implements Logger {
public static final int COLS_MIN = 10;
public static final int COLS_DEFAULT = 20;
private int cols;
private int numBytes;
private StringBuffer hBuf;
private StringBuffer cBuf;
private StringBuffer pBuf;
private PrintStream out;
public PrintStreamLogger( PrintStream out ){
this( out, COLS_DEFAULT );
}
public PrintStreamLogger( PrintStream out, int cols ){
this.out = out;
this.cols = ( cols > COLS_MIN ? cols : COLS_MIN );
}
private char convertChar( char ch ){
if( ch < 0x20 ) return '.';
return ch;
}
public void logEnd( RecordStore rs ){
out.println( "nActual size of records = "
+ numBytes );
printChar( '-', cols * 4 + 1 );
hBuf = null;
cBuf = null;
pBuf = null;
}
public void logException( String name, Throwable e ){
out.println( "Exception while analyzing " +
name + ": " + e );
}
public void logException( RecordStore rs, Throwable e ){
String name;
try {
name = rs.getName();
} catch( RecordStoreException rse ){
name = "";
}
logException( name, e );
}
public void logRecord( RecordStore rs, int id,
byte[] data, int len ){
if( len < 0 && data != null ){
len = data.length;
}
hBuf.setLength( 0 );
cBuf.setLength( 0 );
numBytes += len;
out.println( "Record #" + id + " of length "
+ len + " bytes" );
for( int i = 0; i < len; ++i ){
int b = Math.abs( data[i] );
String hStr = Integer.toHexString( b );
if( b < 0x10 ){
hBuf.append( '0');
}
hBuf.append( hStr );
hBuf.append( ' ' );
cBuf.append( convertChar( (char) b ) );
if( cBuf.length() == cols ){
out.println( hBuf + " " + cBuf );
hBuf.setLength( 0 );
cBuf.setLength( 0 );
}
}
len = cBuf.length();
if( len > 0 ){
while( len++ < cols ){
hBuf.append( " " );
cBuf.append( ' ' );
}
out.println( hBuf + " " + cBuf );
}
}
public void logStart( RecordStore rs ){
hBuf = new StringBuffer( cols * 3 );
cBuf = new StringBuffer( cols );
pBuf = new StringBuffer();
printChar( '=', cols * 4 + 1 );
numBytes = 0;
try {
out.println( "Record store: "
+ rs.getName() );
out.println( " Number of records = "
+ rs.getNumRecords() );
out.println( " Total size = "
+ rs.[/!--empirenews.page--]getSize() );
out.println( " Version = "
+ rs.getVersion() );
out.println( " Last modified = "
+ rs.getLastModified() );
out.println( " Size available = "
+ rs.getSizeAvailable() );
out.println( "" );
} catch( RecordStoreException e ){
logException( rs, e );
}
}
private void printChar( char ch, int num ){
pBuf.setLength( 0 );
while( num-- > 0 ){
pBuf.append( ch );
}
out.println( pBuf.toString() );
}
}
// A logger that outputs to System.out.
public static class SystemLogger extends PrintStreamLogger
{
public SystemLogger(){
super( System.out );
}
public SystemLogger( int cols ){
super( System.out, cols );
}
}