Как читать записи после удаления в rms в мидлете j2me?

Я использую концепцию rms в своем приложении j2me.

Первые записи добавлены в rms успешно, затем записи чтения также прекрасны, но когда я собираюсь добавить еще одну запись одновременно, она не будет добавлена ​​в мой список, она была успешно добавлена ​​в rms, но в этот раз не обновлялась.

Если я выхожу из приложения один раз, а затем запускаю приложение, которое хорошо записывает чтение, отображаются все записи. Как обновить список и получить все записи?

Это мой источник для добавления записей:

public void AddCustomer(String str) throws RecordStoreNotOpenException
{       
    byte[] rec=str.getBytes();
    try
    {
        rs19 = RecordStore.openRecordStore(ADDREMOVE_CUSTOMER, true);
        rs19.addRecord(rec, 0, rec.length);
        System.out.println("REcord added successfully");
        v.addElement(str);
    }
    catch (Exception e)
    {
    }
}

Это источник для прочитанных записей:

public ChoiceGroup getChoiceGroup10() {
    if (choiceGroup10 == null) {                                   
        choiceGroup10 = new ChoiceGroup("Select Customer", Choice.POPUP);                                     
        choiceGroup10.append("none", null);       
        try
        {
            rs19.openRecordStore(ADDREMOVE_CUSTOMER, true);
            String value="";
            String comma=",";
            Vector v1=new Vector();
            StringBuffer enumList=new StringBuffer();
            recEnum = rs19.enumerateRecords( null, null, false );
    while( recEnum.hasNextElement() )
            {
                byte[] data = recEnum.nextRecord();
                enumList.append(new String(data));
                enumList.append(",");
            }
            records=new String(enumList);
            int index=records.indexOf(comma);
            while(index>=0)
            {
                v1.addElement(records.substring(0,index));
                records = records.substring(index+comma.length());
                index = records.indexOf(comma);
            }
            v1.addElement( records );
            if( v1.size()>0 )
            {
                for(int i=0; i<v1.size(); i++)
                {
                    value= (String)v1.elementAt(i);
                    choiceGroup10.append(value, null);
                }
            }
        }
        catch(InvalidRecordIDException ie)
        {
            ie.printStackTrace();
        }
        catch(RecordStoreException re)
        {
            re.printStackTrace();
        }
        catch(NullPointerException ne)
        {
            System.out.println(ne);
        }
        finally
        {
            try {
                rs19.closeRecordStore();
            } catch (RecordStoreException ex) {
                ex.printStackTrace();
            }
        }

    }                          
    return choiceGroup10;
}

person cheliyan    schedule 21.07.2012    source источник


Ответы (2)


  recEnum = rs19.enumerateRecords( null, null, false ); // --> keepUpdated is false

То, как вы описываете, добавлено в rms успешно, но не обновлено в это время, по-видимому, определяется третьим параметром, переданным в enumerateRecords.

Чтобы понять, почему это так, и узнать, как использовать параметры метода, обратитесь к документации по API (доступен в Интернете) - обратите внимание на объяснение параметра keepUpdated:

public RecordEnumeration enumerateRecords(RecordFilter filter,
                                          RecordComparator comparator,
                                          boolean keepUpdated)
                                   throws RecordStoreNotOpenException

    Returns an enumeration for traversing a set of records in the record store
      in an optionally specified order...

    Parameters:
        filter - if non-null, will be used to determine what subset
          of the record store records will be used
        comparator - if non-null, will be used to determine the order
          in which the records are returned
        keepUpdated - if true, the enumerator will keep its enumeration
          current with any changes in the records of the record store.
          Use with caution as there are possible performance consequences.
          If false the enumeration will not be kept current and may return
          recordIds for records that have been deleted or miss records
          that are added later. It may also return records out of order
          that have been modified after the enumeration was built.
          Note that any changes to records in the record store are
          accurately reflected when the record is later retrieved,
          either directly or through the enumeration. The thing that is
          risked by setting this parameter false is the filtering and
          sorting order of the enumeration when records are modified,
          added, or deleted.
          ...

Учитывая вышеизложенное, рассмотрите возможность тестирования вашего мидлета с другим значением параметра keepUpdated:

  recEnum = rs19.enumerateRecords(null, null, true); // --> test with 'true' here
person gnat    schedule 21.07.2012
comment
Я также попробовал ваше предложение, но не получил. - person cheliyan; 21.07.2012

Хотя gnat полностью корректен, есть веские причины, по которым никто не использует параметр keepUpdated (полагаясь на очень плохую часть MIPD). спецификация, потеря контроля над синхронизацией...).

Если вы хотите контролировать поведение своего приложения, параметр keepUpdated должен оставаться ложным, а ваш метод AddCustomer() должен закрывать RecordStore.

Затем вам нужен механизм, который запускает обновление вашего графического интерфейса (путем повторного выполнения всего вашего метода getChoiceGroup10() и отображения нового результата на экране), потому что AddCustomer() был успешно вызван. Чтобы сделать это должным образом, вам необходимо глубокое понимание вашей модели многопоточности GUI. Вы используете LWUIT? Вы создали поток только для вашего графического интерфейса? Графический интерфейс обновляется только при необходимости или у него есть частота кадров?

Основываясь на этом понимании, вы будете либо использовать интерфейс слушателя, либо использовать синхронизацию, либо установить флаг для обновления части экрана позже...

Как правило, вы бы не хотели, чтобы поток, который рисует на экране, также читал из RecordStore, поэтому вы можете фактически переписать свой метод getChoiceGroup10(), чтобы разделить его содержимое на 2 потока.

person michael aubert    schedule 21.07.2012