2010-03-31 47 views
1

我想知道是否有可能在j2me有2個或更多的記錄存儲在同一時間打開。我基本上希望能夠在代碼的相同執行中添加/刪除2個不同recordStore中的記錄。這可能嗎?是否可以在j2me中同時打開和編輯2個或更多的RecordStore?

如果是這樣,你會怎麼做?在班級的頂部,你可以做一些類似'私人RecordStore rs'的東西你需要有兩個這樣的實例才能使它工作,或者你可以用一個聲明來做到嗎?

在此先感謝。

+0

如果你想要兩個的RecordStore實例是在同一時間打開,您不能使用兩個相同的變量。 – 2010-04-07 10:24:43

回答

3

RecordStore javadoc:「一個MIDlet套件中的MIDlet被允許創建多個唱片店,只要它們分別賦予不同的名字。當一個MIDlet套件從平臺刪除了所有與它的MIDlet相關的唱片店會。 MIDlet套件中的MIDlet可以直接訪問彼此的記錄存儲。「

因此,您可以在MIDlet中操作多個記錄存儲。

下面是我有時與學生一起使用的示例(警告:此MIDlet中沒有UI:僅用於演示目的)。你可以看到使用一個或兩個變量並不重要。

package test; 

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import javax.microedition.midlet。*; import javax.microedition.rms.RecordEnumeration; import javax.microedition.rms.RecordStore; import javax.microedition.rms.RecordStoreException;

公共類ExampleTwoRS擴展的MID​​let {

private final static String RS_BOYS_NAME = "boys"; 
private final static String RS_GIRLS_NAME = "girls"; 

public ExampleTwoRS() { 
    Person[] people = new Person[4]; 
    people[0] = new Person("Angelina", false); 
    people[1] = new Person("Brad", true); 
    people[2] = new Person("Mirka", false); 
    people[3] = new Person("Roger", true); 

    try { 
     initData(people); 
     readData(RS_BOYS_NAME); 
     readData(RS_GIRLS_NAME); 
    } catch (RecordStoreException ex) { 
     ex.printStackTrace(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

public void startApp() { 
} 

private void initData(Person[] people) throws RecordStoreException, IOException { 
    RecordStore rsBoys = null; 
    RecordStore rsGirls = null; 

    try { 
     rsBoys = RecordStore.openRecordStore(RS_BOYS_NAME, true); 
     rsGirls = RecordStore.openRecordStore(RS_GIRLS_NAME, true); 

     for (int i = 0; i < people.length; i++) { 
      byte[] data = people[i].toByteArray(); 
      if (people[i].isMale()) { 
       rsBoys.addRecord(data, 0, data.length); 
      } else { 
       rsGirls.addRecord(data, 0, data.length); 
      } 
     } 
    } finally { 
     rsBoys.closeRecordStore(); 
     rsGirls.closeRecordStore(); 
    } 
} 

private void readData(String rsName) throws RecordStoreException, IOException { 
    RecordStore rs = null; 

    try { 
     rs = RecordStore.openRecordStore(rsName, true); 

     int i = 0; 
     RecordEnumeration re = rs.enumerateRecords(null, null, true); 
     Person[] people = new Person[re.numRecords()]; 
     while (re.hasNextElement()) { 
      people[i] = new Person(); 
      people[i].fromByteArray(re.nextRecord()); 
      System.out.println(rsName + ": " + people[i].toString()); 
      i++; 
     } 
    } finally { 
     rs.closeRecordStore(); 
    } 
} 

private void initNumbers() { 
} 

public void pauseApp() { 
} 

public void destroyApp(boolean unconditional) { 
} 

}

類Person { 私人字符串名稱; boolean male;

public Person() { 
} 

public Person(String name, boolean male) { 
    this.name = name; 
    this.male = male; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public boolean isMale() { 
    return male; 
} 

public void setMale(boolean male) { 
    this.male = male; 
} 

public void fromDataStream(DataInputStream dis) throws IOException { 
    this.name = dis.readUTF(); 
    this.male = dis.readBoolean(); 
} 

public void toDataStream(DataOutputStream dos) throws IOException { 
    dos.writeUTF(getName()); 
    dos.writeBoolean(isMale()); 
} 

public void fromByteArray(byte[] data) throws IOException { 
    ByteArrayInputStream bin = new ByteArrayInputStream(data); 
    DataInputStream din = new DataInputStream(bin); 

    fromDataStream(din); 
    din.close(); 
} 

public byte[] toByteArray() throws IOException { 
    ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
    DataOutputStream dout = new DataOutputStream(bout); 

    toDataStream(dout); 
    dout.close(); 

    return bout.toByteArray(); 
} 

public String toString() { 
    return name + (male ? " (b)" : " (g)"); 
} 

}

+1

我想補充一點,雖然規範當然允許單個MIDlet使用多個RecordStore,但它並不能證明它們都可以同時打開。這是一個開放解釋的分裂點,需要在實際的目標手機上進行測試。 – 2010-04-07 10:27:30

+0

+1好站出來,謝謝。 – jalopaba 2010-04-07 11:27:11

相關問題