niedziela, 30 listopada 2008

Filtrowanie i sortowanie danych w OpenBaseMovil-db

Praca inżynierska wymaga ode mnie wykonania tych operacji w OpenBaseMovil-db no to przy okazji opiszę jak to się robi ;-)

Sortowanie
To będzie proste :)
Najpierw musimy pobrać jakiś zbiór danych, a następnie wykonań na nim metodę sort gdzie parametrami są:
String fieldName - kolumna po której sortujemy
int mode - rosnąco czy malejąco (RowSet.DESCENDING/RowSet.ASCENDING) - wartość domyślna to rosnąco.
Przykład:
RowSet firmy = Firmy.findAll();
firmy.sort("nazwa", RowSet.DESCENDING);
I to wszystko:) Przeglądając zbiór firmy będą one uszeregowane malejąco wg kolumny nazwa.

Filtrowanie
OpenBaseMovil-db ma niestety sporą wadę, nie można wyszukiwać danych które zawierają jakiś fragment tekstu (wyjątek - dana wartość zaczyna się od podanej sekwencji) dlatego zmuszeni jesteśmy do tworzenia własnych filtrów danych.
Aby tego dokonać musimy poprzez metodę RowSet.applyFilter przekazać obiekt implementujący interfejs RowFilter. Interfejs ten wymusza implementację metody matches(Row row) która zwraca wartość boolowską w zależności czy dany rekord ma zostać dołączony do wyniku czy nie.
Następnie możemy wykonać jedną z dwu operacji:
- RowSet.clearFilter() - aby anulować filtr i odzyskać początkowy zbiór
- RowSet.packFilter() - aby odrzucić wszystkie rekordy nie pasujące i dalej np. móc zastosować inny filtr.
Przykład:
RowSet set = stocks.findAll();
set.applyFilter(new RowFilter() {
public boolean matches(Row row) {
return row.getString("name").indexOf(name) == -1 ? false : true;
}
});
set.packFilter();
Wracam do pisania.... ;-)

2 komentarze:

  1. Hi, I'm sorry to post in English, please feel free to translate my words to Polish.
    (I just used google to translate and be able to read our comments).
    First of all, we are really glad that you find OpenBaseMovil useful and write about it.
    The truth is that you can perform an almost-full-text search using OpenBaseMovil, which is really fast.
    We recommend to use filters only on small amounts of data.
    When you define the indexes of your table, you can create a full text index that comprises one or more columns, and it will index each and every word of the fields instead of the unique field contents.
    Then, if you apply a findFuzzy over that index you will have a search that will return all records which contain a word that starts with the given string.
    For example, if you have the following values:
    record 1: "Samuel Jackson"
    record 2: "She is Sammantha, she has a blue shirt"
    record 3: "Bluetooth icon is, surprisingly, blue"

    The index will have the following keys:
    "samuel", "jackson", "sammantha", "has", "blue", "shirt", "bluetooth", "icon", "is", "surprisingly"

    Note that "blue" is indexed once, poiting to records 2 and 3.
    Note also that "a" is considered an empty word an thus not indexed (this can be modified easily)

    If you search for "Bluetooth" it will find just record 3.
    A search for "blue" will return both record 2 and 3.
    And a search for "sam" will return both record 1 and 2 (matching both "Samuel" and "Sammantha").
    A search for "tooth" will return an empty RowSet.

    We use this with our commercial applications, with databases of several megabytes and tables with tenths of thousands of rows. And it is more than enough for what users usually need.

    I hope this is illustrative and can help you to further develop your skills with OpenBaseMovil.

    I also encourage you to take a look at the rest of the framework, since the xml way of defining views allows your application to be more portable (and benefit from upcomming releases that will generate applications for BlackBerry and other platforms), and also gives you very powerful "data aware" views to navigate and edit your data.

    Regards,
    Narciso Cerezo
    CTO Elondra - OpenBaseMovil

    OdpowiedzUsuń
  2. Hello !
    Thank you for your great comment!
    I read about using indexes and findFuzzy in Devepoler Guide and I think that it provides a very powerfull search mechanism.
    I'll try to write about it in one of my future posts.

    Feel free to comment my other post about this framework. I'm quite new to OpenBaseMovil-db ;)

    Regards,
    Lukas

    OdpowiedzUsuń