Исчерпывающий пример по RecordStore j2me?
0) На дворе 2023 год (конец). У всех мобильные устройства с Андроид/IOS: телефоны, планшеты, часы и другие.
1) У меня кнопочный телефон с поддержкой j2me+, Netbeans 7.4+, j2me sdk+, emulator.
2) В сети нету примера по этой технологии, чтобы работал как часы. Везде какие-то недоработанные примерчики.
3) Глобальная задача такая: нужен полный пример (не класс, недоработанный, с багами) по RecordStore, а именно: чтобы мидлет включал в себя следующие методы:
Create_If_Not_exist/Open/Append/Set/Delete/Get_Number_Of_Records/Get_All_Recod_Store_List/
Delete_All_Record_Store_List/Close.
4) Локальная задача такая:
При первом запуске мидлета:
Создал.
Открыл.
Добавил 10 записей с текстом "Hello_World".
Закрыл.
При втором запуске и далее всегда:
Открыл.
Считал. (Вывел на экран все 10 записей (этих же, которые сохранил).)
2-ю запись сделал такой: "Hello_World_2222222".
Закрыл.
5) Это всё что нужно. Заранее спасибо.
Ответы (1 шт):
Вот что получилось. Думаю, локальная задача решена полностью. Код взял у пользователя @Lucifer, и немного подкрасил. Все замечания в коде написаны, оказывается, надо нажимать на кнопку ("стоп") в Netbeans 7.4 , а эмулятор не закрывать, иначе все записи удаляются. А потом снова нажимать на кнопку ("запустить").
package k;
import javax.microedition.rms.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
public class RW extends MIDlet
{
public static RecordStore rs = null;
public static RecordEnumeration re=null;
public static int Length0000=10;
public static String EmptyValue = "Hello World";
public static String REC_STORE_NAME = "MyRS0000";
public static int NumberOfRecordStore = 0;
public RW(){
}
public static void create_Storage(int Length) throws RecordStoreNotOpenException
{ if(!(rs.getNumRecords()>0)){
for(int i=1;i<=Length0000;i++){appendRecord((EmptyValue));}
}
printing("Recordstore: "+ REC_STORE_NAME+ "is created");
}
public void startApp()
{
//new RW();
//Внимание_0: нужно нажимать на красную кнопку не телефона эмулятора,
//а красную кнопку вывода консоли("остановить"),и потом, снова зеленую кнопку
//IDE Netbeans("запустить"), и так N раз. Т.о. эмулятор не закрывается,
//и все записи хранилища (RecordStore) сохраняются.
//Код взят от пользователя (Lucifer) с сайта stackoverflow.com.
//и доработан мною (Alunts Arthur Arthurovich).
//нимание_1: Хранилище индексируется с 1 (но не с 0).
//Внимание_2: Не забваейте инициировать пременные, если используете класс как внешний.
//Внимание_3: Не забвайте дописывать логику сохранения в destroyApp();
try {
openRecStore();
create_Storage(10); //создаем хранилище с 10-ю записями
//со стнадартным значением EmptyValue.
//appendRecord("Hello World"); //добавляем 1 новую запись запись в конец,
if((rs.getNextRecordID()>0)){
setRecord(2, "Hello_World_2222222");} // задаём запись под номером 2
getRecord(2); //читаем запись под номером 2
read_All_Records(); //читаем все записи
getNumber_0(); //Выдаем число всех записей
getRecordStore_Name(rs); //Читаем имя оккрытой записи
closeRecStore(); // закрываем все записи
//deleteRecStore(); // удаляем все записи хранилища (хранилище должно быть закрыто)
} catch (RecordStoreNotOpenException ex) { ex.printStackTrace(); } catch (RecordStoreException ex) {
ex.printStackTrace();
}
}
public void pauseApp()
{
}
public void destroyApp( boolean unconditional )
{
//Здесь сохраняемся, если нужно:
// делаем: appendRecord("Record_11111");
// делаем: setRecord(2, "Value_22222");
// делаем: closeRecStore();
printing("Saved, CloseD , Exit");//Эта строчка может и не выводится
notifyDestroyed();
}
public static void openRecStore()
{
try
{
rs = RecordStore.openRecordStore(REC_STORE_NAME, true );
printing("RecordStore: "+REC_STORE_NAME +" is opened!");
if(rs.getNumRecords()>0){
printing("RecordStore: "+REC_STORE_NAME +" is created!");
}
}
catch (Exception e) { printing(e.toString());
}
}
public static void getRecordStore_Name(RecordStore RS)
{
try
{
if(rs.getNumRecords()>0){
String Name0 = rs.getName();
// int ID_0 = rs.getNextRecordID();
printing("Name_of_Opened_RecordStore: " + Name0 + "");
}
}
catch (Exception e)
{
printing(e.toString());
}
}
public static void getNumber_0()
{
try{
NumberOfRecordStore=rs.getNumRecords();
printing("Number of Records is: "+NumberOfRecordStore);
}catch(Exception ex){ex.printStackTrace();}
}
public static void closeRecStore()
{
try
{
rs.closeRecordStore();
System.out.println("RecordStore: "+REC_STORE_NAME +" is closed");
}
catch (Exception e)
{
printing(e.toString());
}
}
public static void deleteRecStore()
{
if (RecordStore.listRecordStores() != null)
{
try
{
RecordStore.deleteRecordStore(REC_STORE_NAME);
printing("RecordStore: "+REC_STORE_NAME +" is deleted");
}
catch (Exception e)
{
printing(e.toString());
}
}
}
public static void appendRecord(String str)
{
byte[] rec=null;
rec =str.getBytes();
try
{
rs.addRecord(rec, 0, rec.length);
printing(str + " Record is appended: " );
}
catch (Exception e)
{
printing(e.toString());
}
}
public static void setRecord(int i, String str)
{
byte[] rec = str.getBytes();
try
{
rs.setRecord(i, rec, 0, rec.length);
//rs.setRecord(rec, 0, rec.length);
printing("Record is setted "+ "["+ i+ "]: "+ str);
}
catch (Exception e)
{
printing(e.toString());
}
}
public static String getRecord(int i) {
int ii=0;
String Out="";
try
{
byte[] recData = new byte[10];//Не знаю зачем это надо!
int len;
if (i<=rs.getNumRecords()){
if (rs.getRecordSize(i) > recData.length)
recData = new byte[rs.getRecordSize(i)];
len = rs.getRecord(i, recData, 0);
Out = new String(recData, 0, len);
ii=i;
printing("Record is getted: "+ "["+ ii+ "]"+ Out);
}
}
catch (Exception e)
{
printing(e.toString());
}
return Out;
}
public static void read_All_Records() throws RecordStoreException{
int i=0;
re = rs.enumerateRecords(null, null, false);
while (re.hasNextElement()){
i++;
String s = new String(re.nextRecord());
printing("Readen record ["+ i +"] is : " + s+"" );
}}
static void printing(String str)
{
System.out.println(" " + str);
}
}