Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[J2ME] Przeszukiwanie rekordu RMS

iie 01 Sty 2011 18:55 1370 8
  • #1 01 Sty 2011 18:55
    iie
    Poziom 15  

    Witam

    Kolejny dzień rodzi kolejne problemy = ). Tak więc udało mi się wyciągnąć dany rekord z RMSa, moja aplikacja możne znaleźć również rekord po danej frazie, także pasmo sukcesu. Pytanie moje jest takie, chciałbym dopisać do rekordu dwie liczby [ to można łatwo zrobić za pomocą setRecord ], chciałbym jednak mieć dostęp do tych dwóch pól [ do każdego osobno ] czy jest to jakoś wykonalne i jeżeli tak to jak [ algorytmicznie ]?

    0 8
  • #2 01 Sty 2011 20:49
    przemo_wielki
    Poziom 23  

    W jaki sposób zapisujesz? Spróbuj coś takiego:

    Code:
    byte[] byteInputData = new byte[200];
    
                    ByteArrayInputStream inputStream = new ByteArrayInputStream(byteInputData);
                    DataInputStream is = new DataInputStream(inputStream);
                    rc.getRecord(ktoryrek,byteInputData , 0);
                    zmienna1 = is.readInt();
                    zmienna2 = is.readInt();

    0
  • #3 01 Sty 2011 21:07
    iie
    Poziom 15  

    Code:
     public void writeRecord(String str, RecordStore type) throws RecordStoreException {
    
            byte[] rec = str.getBytes();
           
            System.out.println("Rec Length "+rec.length);
            try {
                System.out.println("1 try:");
              recordIDs.addElement(new Integer(lastID++));

               type.addRecord(rec, 0, rec.length);


                } catch (Exception e) {
                System.out.println("Write record error: " + e);
            }
           
        }


    tak zapisuje :), wolałbym nie zmieniać tego sposobu, tzn jeżeli nie ma innego wyjścia.

    0
  • #5 01 Sty 2011 21:45
    iie
    Poziom 15  

    no cóż, to nie jest najprostsze, taki przykładzik tutaj np wczytuje się dany rekord:

    Code:
    public String profilRmsSearcher(String st) throws RecordStoreException{
    
        String string = null;

        filter = new Filter(st);
        recordEnumeration = rs.enumerateRecords(filter, null, false);
            if (recordEnumeration.numRecords() > 0){
              string = new String(recordEnumeration.nextRecord());
        }
      System.out.println("enumka: " +recordEnumeration.hasNextElement());
            return string;
    }

    public Form info () throws RecordStoreException{
        infos= new Form("Informacje o samochodzie");
        bk=new Command("Back",Command.BACK,2);
        infos.addCommand(bk);
        infos.setCommandListener(this);
        infos.append(profilRmsSearcher(ldr.getString(ldr.getSelectedIndex())));
        return infos;
    }


    klasa do filtra pewnie zbędna, ale daj na wszelki wypadek = )

    Code:
    class Filter implements RecordFilter
    
    {
      private String search = null;
      private ByteArrayInputStream inputstream = null;
      private DataInputStream datainputstream = null;
      public Filter(String search)
      {
        this.search = search.toLowerCase();
      }
      public boolean matches(byte[] suspect)
      {
        String string = new String(suspect).toLowerCase();
        if (string!= null && string.indexOf(search) != -1)
          return true;
        else
          return false;
      }
      public void filterClose()
      {
        try
        {
          if (inputstream != null)
          {
            inputstream.close();
          }
          if (datainputstream != null)
          {
            datainputstream.close();
          }
        }
        catch ( Exception error)
        {
        }
      }
    }

    0
  • #6 01 Sty 2011 22:25
    przemo_wielki
    Poziom 23  

    Z tego co widać zwraca Ci Stringa, jak masz np. wartość 1 i dopiszesz 2 to zwraca Ci 12?

    0
  • #7 01 Sty 2011 22:45
    iie
    Poziom 15  

    tak więc w kolejności, zaintrygowały mnie te strumienie, podeprę się przykładem z tej strony

    Link

    zapis

    Code:
    public void writeStream(boolean[] bData, int[] iData, String[] sData)
    
    {
         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.writeBoolean(bData[i]);
             strmDataType.writeInt(iData[i]);
             strmDataType.writeUTF(sData[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());
         }
    }


    i odczyt:

    Code:
    public void readStream()
    
    {
         try
         {
           // Allocate space to hold each record
           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("Boolean: " + strmDataType.readBoolean());
             System.out.println("Integer: " + strmDataType.readInt());
             System.out.println("String: " + strmDataType.readUTF());
             System.out.println("--------------------");

             // Reset so read starts at beginning of array
             strmBytes.reset();
           }

           strmBytes.close();
           strmDataType.close();

         }
         catch (Exception e)
         {
           db(e.toString());
         }
    }


    czy jeżeli zapisze cos takiego " java jest fajna 12 ale czasem 1234 denerwujaca"

    to przy odczycie stringa dostane: " java jest fajna ale czasem denerwująca"

    a przy intach: " 12, 1234"

    ?

    i teraz odpowiedź na post ostatni = )

    muszę trochę sprostować swój zapis, tutaj taki wycinek:

    Code:
     writeRecord(nop.getString()+" \n"+converter()+" \n"+nad.getString(nad.getSelectedIndex())+" \n"+wacha.getString(wacha.getSelectedIndex())+
    
                            " \n" + poj.getString(poj.getSelectedIndex()) + " \n" + rocznik.getString(rocznik.getSelectedIndex()) ,rs);


    czyli po każdym stringu mam "entera", myślałem o jakimś substringu czy cóś = ), ale nie wiem za bardzo jak się wstrzelić w odpowiednie miejsca. Chciałbym na końcu tego rekordu dodać parę intów właśnie i mieć dostęp do poszczególnych

    0
  • #8 01 Sty 2011 22:59
    przemo_wielki
    Poziom 23  

    Przy strumieniach zwróci Ci ładnie w kolejności tylko musisz dbać o porządek (kiedy wpisujesz String kiedy int ... i w takiej samej kolejności odczytywać!). Co do Twojego sposobu to możesz właśnie parsować Stringa umieszczając podczas zapisu konkretnej wartości jakiś znak ASCII np. @ (@java@jest@12@...) można też przy mniejszej ilości danych zapisywać ich rozmiar jako 'nagłówek' danej (4java4jest212 lub 3456212 = 456,12) także metod może być kilka ale ja polecam korzystanie ze strumieni bo bardzo upraszczają zapis i odczyt danych z RMS.

    0
  • #9 01 Sty 2011 23:19
    iie
    Poziom 15  

    hmm, a jeżeli mam parę intów w rekordzie np 12, 43, 56, 78 to jest możliwość dogrzebania się do np '56'?

    O, i jeszcze coś. Czy będę mógł z tego strumienia wykroić normalnego stringa? Jest to dość istotne.

    edyt z dnia dzisiejszego [02-01-11]

    chyba będę musiał odpuścić z tymi strumieniami, za dużo trzeba zmieniać przy rzeczach działających, wpadłem natomiast na taki pomysł, czy dałoby się zrobić coś takiego, umieścić jakiś odnośnik na końcu aktualnego rekordu w obecnym recordStore np jakiś numer identyfikacyjny, a następnie stworzyć nowego RS który operowałby już na strumieniach i zawierał w sobie tylko inty niezbędne do danego profilu? Trochę zawiłe :), powiedzmy coś takiego rs ma w sobie rekord z profilem testowytest, w drugim rsie tworzy się rekord o takim samym początku zawierający już inty [ na strumieniach ] niezbędne do dalszych operacji.
    Tutaj rodzi się kolejne pytanie, czy można wpisać rekord do rmsa z góry zadanym ID
    Lamerskie rozwiązanie, ale czasu mało = ).

    Dużo tych edycji dzisiaj, chyba przerzucę się na regularne wyrażenia i jakieś rzutowanie, mój poprzedni pomysł zrodził za dużo problemów :/

    Zaraz oszaleje, nie mam biblioteki java.util.regex a mam jdk 1.6, jest jakieś logiczne wyjaśnienie tego cudu?

    0