Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki od 1 do 10 z 12

Wątek: SQLite, like i znaki narodowe

  1. #1

    Dołączył
    10 2010
    Posty
    756
    Telefon
    S3
    Sieć
    Orange
    Piwa (Postawione)
    5
    Piwa (Otrzymane)
    77

    Domyślnie SQLite, like i znaki narodowe

    Zadałem tu jedno pytanie i spotkało się to ze sporym odzewem, więc rzucę taki inny temat, może pominąłem jakiś aspekt i dlatego był to dla mnie problem, a może też komuś to pomoże .

    Otóż korzystam z bazy danych do przechowywania danych o finansach. Czymś normalnym jest tam możliwość wprowadzenia opisu transakcji, płatnika/odbiorcy transakcji, a także kategorie mają własne nazwy. Z uwagi na ukierunkowanie Androida na wyszukiwanie danych (jest nawet wymagany fizyczny przycisk odpalający wyszukiwanie) także zaimplementowałem sobie mechanizm wyszukiwania przy pomocy SearchManager (pojawia się od góry standardowy popup z ikonką, możliwością wpisania co chcemy szukać - po prostu standard).

    Nie szuka się tu dokładnie po opisie, tylko jak to z reguły bywa po części tekstu (prawie jak Google ), ja sobie ustaliłem, że może to być zawartość wyżej wymienionych pól. Oczywiście całość działa poprzez zwykłe, standardowe LIKE w SQLu. I tu zaczynają się schody, SQLite niepoprawnie interpretuje LIKE zawierający polskie znaki. Tzn. po prostu nie znajdzie nigdy rekordu który pasuje, jednak w szukanym tekście jest polska litera. Miał ktoś podobny problem?

    PS. Ja to rozwiązałem dzieląc wyszukiwanie na dwa etapy, pierwszy uogólniam wyszukiwany ciąg pozbywając się polskich znaków, drugi przed akceptacją rekordu ponownie go weryfikuje i sprawdzam, czy nie należy go czasem pominąć.
    PS2. Raczej odpadają rozwiązania oparte o FTS3 i FTS4, bo wymuszałyby konieczność przygotowania tabel w tym formacie z zawartością wszystkich pól po których szukamy przed samym wyszukiwaniem. Tak więc ewentualne korzyści (np. czas wyszukiwania) były znikome, a nie wiem nawet czy nie napotkałbym tego samego problemu tutaj.

  2. #2
    Awatar piotrpo

    Dołączył
    01 2010
    Skąd
    Gdynia
    Posty
    2,947
    Telefon
    Next Nexus
    Tablet
    Nexus 7
    Sieć
    Play
    Piwa (Postawione)
    157
    Piwa (Otrzymane)
    358

    Domyślnie

    Zrób sobie dodatkową kolumnę do wyszukiwania, bez polskich znaków. Rozwiązanie nie jest eleganckie, idealne itp. ale najszybsze chyba.
    Na jakieś rozszerzenia SQLite bym za bardzo nie liczył - próbowałem kiedyś uruchomić na androidzie jakąś tabelę wirtualną i był spory problem (chodziło o rindex) - implementacja SQLite na telefonie nie jest aż tak pewna, jak Google twierdzi.
    Świnie w bunkrze Nowa gra na twój telefon

    Blog - Zabawy w programowanie

  3. #3

    Dołączył
    10 2010
    Posty
    756
    Telefon
    S3
    Sieć
    Orange
    Piwa (Postawione)
    5
    Piwa (Otrzymane)
    77

    Domyślnie

    Cytat Zamieszczone przez piotrpo Zobacz posta
    Zrób sobie dodatkową kolumnę do wyszukiwania, bez polskich znaków. Rozwiązanie nie jest eleganckie, idealne itp. ale najszybsze chyba.
    Na jakieś rozszerzenia SQLite bym za bardzo nie liczył - próbowałem kiedyś uruchomić na androidzie jakąś tabelę wirtualną i był spory problem (chodziło o rindex) - implementacja SQLite na telefonie nie jest aż tak pewna, jak Google twierdzi.
    To rozwiązanie odrzuciłem na starcie. Za dużo pól, za dużo danych byłoby powielonych, a przecież rozmiar bazy też jest istotny. Wirtualne tabele także wykorzystuje bez większych problemów (przynajmniej jak na razie w zakresie jaki potrzebuję), jednak to, że implementacja SQLite zawarta w Androidzie troszkę odstaje to już zdążyłem zauważyć . Poza tym sam SQLite jest jak dla mnie sporą... powiedzmy jest ułomny (z reguły pracuję na bazach Oracle i Firebird).

  4. #4
    Awatar piotrpo

    Dołączył
    01 2010
    Skąd
    Gdynia
    Posty
    2,947
    Telefon
    Next Nexus
    Tablet
    Nexus 7
    Sieć
    Play
    Piwa (Postawione)
    157
    Piwa (Otrzymane)
    358

    Domyślnie

    Akurat w porównaniu do Oracle, to każda baza danych jest lepsza (naprawdę nie lubię tego silnika)
    Tak mi przyszło do głowy - nie wrzucałeś tych danych jakoś "inaczej" że nie chce ci wyszukiwać?
    Świnie w bunkrze Nowa gra na twój telefon

    Blog - Zabawy w programowanie

  5. #5
    Awatar zawadaki

    Dołączył
    07 2010
    Posty
    743
    Telefon
    Galaxy Nexus
    Tablet
    Nexus 7
    Sieć
    Orange
    Piwa (Postawione)
    0
    Piwa (Otrzymane)
    107

    Domyślnie

    biorąc pod uwagę twoje niezwykle wygórowane wymazania pozostaje jedynie Full-Text czyli wspomniany już FTS3, można jeszcze zamienić polskie znaki na coś unikalnego i zjadliwego dla mechanizmu wyszukiwania ale tu zawsze występuje rozrost informacji a chcesz mieć możliwie mała bazę nie wspominając o startach w czasie choć nie sądzę żeby to był problem w twoim przypadku

    PS. właśnie zrobiłem eksperyment dziwne ale wcześniej nie zastanawiałem się na tym wydało się to oczywiste, mechanizm wyszukiwania prawidłowo radzi sobie z lokalizowanymi znakami. sprawdź czy czegoś nie pokręciłeś albo daj sobie spokój z usługą i zrób własny CursorAdapter z AutoCompleteTextView
    Ostatnio edytowane przez zawadaki ; 10-04-11 o 13:08

  6. #6

    Dołączył
    10 2010
    Posty
    756
    Telefon
    S3
    Sieć
    Orange
    Piwa (Postawione)
    5
    Piwa (Otrzymane)
    77

    Domyślnie

    Cytat Zamieszczone przez piotrpo Zobacz posta
    Akurat w porównaniu do Oracle, to każda baza danych jest lepsza (naprawdę nie lubię tego silnika)
    Tak mi przyszło do głowy - nie wrzucałeś tych danych jakoś "inaczej" że nie chce ci wyszukiwać?
    Trudno stwierdzić "inaczej". Problem w tym, że LIKE musi być case insensitive i tak też jest w SQLite, jednak z wyłączeniem znaków narodowych. Nawet UPPER działa niepoprawnie, bo nie potrafi np. z ó zrobić Ó. Pewnie cały problem leży właśnie w obsłudze znaków narodowych jeśli chodzi o rozmiar znaków.

    Jasne, można i problem błahy, pomijalny, ale trochę głupio zrobić mechanizm w którym wpisując słowo "śliwka", program nie znajdzie pozycji nazwanej "Śliwka" .

    Cytat Zamieszczone przez zawadaki Zobacz posta
    biorąc pod uwagę twoje niezwykle wygórowane wymazania pozostaje jedynie Full-Text czyli wspomniany już FTS3, można jeszcze zamienić polskie znaki na coś unikalnego i zjadliwego dla mechanizmu wyszukiwania ale tu zawsze występuje rozrost informacji a chcesz mieć możliwie mała bazę nie wspominając o startach w czasie choć nie sądzę żeby to był problem w twoim przypadku
    Czyli zakładasz, że w FTS3 byłby taki sam problem? No to już całkiem porażka, to całkiem dyskwalifikuje FTS3. Bo o ile jest uzasadnione wykorzystanie tego mechanizmu w aplikacji która opiera się na wyszukiwaniu (nie wiem, np. jakiś słownik), to w zwykłej aplikacji w której po prostu chce mieć możliwość szukania mija się to z celem.

    A co do zamiany polskich znaków, w tym rozwiązaniu przecież i tak będzie trzeba na końcu zrobić selekcję wyniku podobnie jak ja to rozwiązałem. Czyli jednak SQLite jest tu kulawy i nic się nie da zrobić .

    ---------- Post dołączono o 14:13 ---------- Poprzedni post napisano o 14:12 ----------

    Cytat Zamieszczone przez zawadaki Zobacz posta
    (...) PS. właśnie zrobiłem eksperyment dziwne ale wcześniej nie zastanawiałem się na tym wydało się to oczywiste, mechanizm wyszukiwania prawidłowo radzi sobie z lokalizowanymi znakami. sprawdź czy czegoś nie pokręciłeś albo daj sobie spokój z usługą i zrób własny CursorAdapter z AutoCompleteTextView
    To sprawdź jak to opisałem wyżej, tj. wpisz do pola Śliwka i wyszukaj ten rekord wpisując śliwka

  7. #7
    Awatar zawadaki

    Dołączył
    07 2010
    Posty
    743
    Telefon
    Galaxy Nexus
    Tablet
    Nexus 7
    Sieć
    Orange
    Piwa (Postawione)
    0
    Piwa (Otrzymane)
    107

    Domyślnie

    Cytat Zamieszczone przez The Dino Zobacz posta

    ---------- Post dołączono o 14:13 ---------- Poprzedni post napisano o 14:12 ----------

    [/COLOR]To sprawdź jak to opisałem wyżej, tj. wpisz do pola Śliwka i wyszukaj ten rekord wpisując śliwka
    to nie jest problem z Androidową baza ale ogólnie z SQlite żeby to rozwiązać użyj właśnie FTS3 bo z LIKE to nie wyjdzie

  8. #8

    Dołączył
    10 2010
    Posty
    756
    Telefon
    S3
    Sieć
    Orange
    Piwa (Postawione)
    5
    Piwa (Otrzymane)
    77

    Domyślnie

    Cytat Zamieszczone przez zawadaki Zobacz posta
    to nie jest problem z Androidową baza ale ogólnie z SQlite żeby to rozwiązać użyj właśnie FTS3 bo z LIKE to nie wyjdzie
    Pewnie tak, bo to samo mam na desktopie. To mój pierwszy kontakt z SQLitem i szczerze dobijające to jest. Np. do pól zmiennoprzecinkowych też mam sporo zastrzeżeń i po prostu ich nie stosuję. Ale to inna bajka, w każdym razie faktem jest, że SQLite jest prostą bazą do prostych zastosowań, jednak chcąc wykorzystać Androida bardziej poważnie jesteśmy skazania na SQLita.

    Co do FTS3, to powiem tak, plik bazy około 500kB, praktycznie każda tabela ma pole tekstowe po którym bym chciał szukać, co daje mi bardzo duży narzut do samego przygotowania bazy do jednego, prostego wyszukiwania. Gra nie warta świeczki, wolę swój patent który działa Nie odczytuj moich uwag jako jakiś zarzutów, jest problem, sam go rozwiązałem, jednak zastanawiałem się, czy to jest możliwe, że w tak "międzynarodowym" systemie jakim jest Android coś takiego jest do pomyślenia. Ile trzeba się namęczyć aby zrobić profesjonalną aplikacje która nie ma takich bugów. Po prostu zastanawiałem się, czy nie ma jakiegoś rozwiązania którego jeszcze nie poznałem

  9. #9
    Awatar piotrpo

    Dołączył
    01 2010
    Skąd
    Gdynia
    Posty
    2,947
    Telefon
    Next Nexus
    Tablet
    Nexus 7
    Sieć
    Play
    Piwa (Postawione)
    157
    Piwa (Otrzymane)
    358

    Domyślnie

    Cytat Zamieszczone przez The Dino Zobacz posta
    Trudno stwierdzić "inaczej". Problem w tym, że LIKE musi być case insensitive i tak też jest w SQLite, jednak z wyłączeniem znaków narodowych. Nawet UPPER działa niepoprawnie, bo nie potrafi np. z ó zrobić Ó. Pewnie cały problem leży właśnie w obsłudze znaków narodowych jeśli chodzi o rozmiar znaków.
    To pisz, że problem masz z upper, a nie z like - przecież operator z natury jest case sensitive. Pytałem o to, czy dane w bazie masz załadowane z UI aplikacji, czy też poprzez jakiś import twoich starych danych - mogą pojawić się problemy w takim przypadku.
    Coś mi się kojarzy, że SQLite ma możliwość dopisywania własnych funkcji - może wystarczy napisać własne lower() ?
    Teoretycznie w bazie masz UTF-8, więc problemów z polskimi znaczkami nie powinno być.
    Świnie w bunkrze Nowa gra na twój telefon

    Blog - Zabawy w programowanie

  10. #10

    Dołączył
    10 2010
    Posty
    756
    Telefon
    S3
    Sieć
    Orange
    Piwa (Postawione)
    5
    Piwa (Otrzymane)
    77

    Domyślnie

    Nexus 7 w Polsce!
    Cytat Zamieszczone przez piotrpo Zobacz posta
    To pisz, że problem masz z upper, a nie z like - przecież operator z natury jest case sensitive. Pytałem o to, czy dane w bazie masz załadowane z UI aplikacji, czy też poprzez jakiś import twoich starych danych - mogą pojawić się problemy w takim przypadku.
    Coś mi się kojarzy, że SQLite ma możliwość dopisywania własnych funkcji - może wystarczy napisać własne lower() ?
    Teoretycznie w bazie masz UTF-8, więc problemów z polskimi znaczkami nie powinno być.
    Powinno, nie powinno, ale jest jakaś kulawa implementacja UTFa. Co do UPPERa, z nim nie mam problemu, bo go najzwyczajniej nie używam . Sam LIKE musi być case insensitive, jasne, próbowałem obejść problem UPPERem, ale to mnie doprowadziło tylko do tego, że UPPER ma ten sam bug. Napisać własny LOWER, może, ale zakładam wykorzystanie programu w wielu wersjach językowych, szczerze, nie wiem czy aż tak proste jest napisanie funkcji która działała by dla wszystkich stron kodowych. Problem jest, stosunkowo prosto da się obejść, ale nie ma jakiegoś kompleksowego rozwiązania.

    PS. Dane mam w większości zaimportowane, jednak to akurat nie ma większego znaczenia.

Strona 1 z 2 12 OstatniOstatni

Tagi dla tego wątku

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Windows Phone :: Android :: Forum Windows Phone
Object