2009-05-17 10 views

Odpowiedz

8

Mogę polecić używanie FMDB jako ładnej owijki SQLite kakao.

+0

Czy jesteś pewien, że jest wolny od wycieków pamięci, bezpieczny w użyciu itp.? Z pewnością nie jest kompletny i najwyraźniej nieobsługiwany. Mówię, idź z CoreData i dostroić wydajność, gdy (jeśli) robi się źle – melfar

+0

Przeglądając moje aplikacje pod kątem przecieków, nigdy nie znalazłem żadnych wewnątrz biblioteki. – pgb

+0

To może być lepszy link http://code.google.com/p/flycode/source/browse/#svn/trunk/fmdb –

6

Off szczycie mojej głowie:

  • wykorzystywać transakcje.
  • Upewnij się, że SQL wykorzystuje tabele w correct order.
  • Nie dodawaj indeksów, których nie masz całkowitej pewności.

Być może nie tylko specyficzne dla iPhone'a, ale również dla urządzeń wbudowanych są pewne wspaniałe wskazówki: here.

Ta link dotyczy starszej wersji SQLite, ale nadal jest przydatna.

Wreszcie ten Stack Question ma również pewne dobre informacje.

Obecnie używamy SQLite z aplikacją .Net Compact Framework, a jej wydajność jest fantastyczna, a my poświęciliśmy trochę czasu na optymalizację, ale nie na tyle, na ile mogliśmy.

Powodzenia.

8

Zmierz ślad pamięci swojej aplikacji i poszukaj nieszczelności w Instrumentach. Następnie spróbuj go po wywołaniu sqlite3_exec z:

  • pragma cache_size=1

i/lub

  • pragma synchronous=0

YMMV. Istnieją doniesienia o zwiększeniu wydajności, znacznej redukcji zużycia pamięci RAM i mniejszej liczbie wycieków. Należy jednak zachować ostrożność podczas wprowadzania poprawek bez zrozumienia wpływu (na przykład: synchronous wyłącza spłukiwanie, co znacznie przyspiesza działanie, ale może spowodować uszkodzenie DB, jeśli telefon jest wyłączany w niewłaściwym czasie).

Więcej tutaj: http://www.sqlite.org/pragma.html

+1

+1 dla tego cache_size może pochłonąć sporo pamięci iPhone'a i zajęło mi trochę czasu, zanim to znalazłem. – paulthenerd

3

odkryłem, że często po prostu szybciej uzyskać identyfikatory szukam w złożonym zapytaniu, a następnie dostać resztę informacji na żądanie.

Tak na przykład:

SELECT person_id 
    FROM persons 
WHERE (complex where clause) 

a następnie wyświetlana jest jako każda osoba będę uruchomić

SELECT first_name, last_name, birth_date, ... 
    FROM persons 
WHERE person_id = @person_id 

I zazwyczaj znaleźć to sprawia, że ​​prowadzony przez kwerendy w 1/2 czasu i wyszukiwania dla danej osoby są zwykle rzędu 2ms (jest to na tabelach z 17 tys. wierszy).

Twoje wrażenia mogą się różnić i powinieneś zrobić sobie czas.

Muszę również podziękować Wil Shipley za zaproponowanie tej techniki w jego wykładzie: http://www.vimeo.com/4421498.

Używam w dużym stopniu wzorca nawodnienia/odwodnienia z sqlitebooków, który jest nadzbiorem tej techniki.

1

Jestem leniwy i lubi trzymać w kodzie rdzenia jak najwięcej, dlatego lubię SQLitePersistentObjects narzędzie ORM:

http://code.google.com/p/sqlitepersistentobjects/

dokonaniu modelu domeny obiekty dziedziczą SQLitePersistentObject (ok trochę natrętne), a następnie możesz zachować/odzyskać swoje obiekty w razie potrzeby.

utrzymują:

[person save]; 

Ładowanie go z powrotem jest prawie tak samo łatwe. Każdy obiekt, który można utrwalić, dostaje do niego dodane metody klasy dynamicznej, aby umożliwić wyszukiwanie. Tak więc, możemy odzyskać wszystkie obiekty osoby, które miały na nazwisko „Smith” tak:

NSArray *people = [PersistablePerson findByLastName:@"Smith"]; 
0

Jedna inna opcja jeszcze nie próbował to Core Data (trzeba być iPhone Dev Apple), choć jego 3,0 funkcja i tak to zależy od aplikacji, czy to jest to opcja ..

+0

Wszystkie bieżące aplikacje wymagają złożenia przy użyciu pakietu SDK 3.0, więc powiedziałbym, że Core Data to prawdopodobnie najlepsza opcja. –

+0

Rozumiem, że zgłoszenie nie musi być tworzone w wersji 3.0, tylko zostanie przetestowane przeciwko niemu: "wszystkie zgłoszenia do sklepu App Store zostaną sprawdzone na najnowszej wersji beta systemu iPhone OS 3.0. Jeśli przesłanie aplikacji nie ma miejsca kompatybilny z iPhone OS 3.0, nie zostanie zatwierdzony. " –