2009-05-17 18 views

risposta

8

Posso consigliare l'utilizzo di FMDB come un bel wrapper Cocoa SQLite.

+0

Sei sicuro che sia privo di memoria, sicuro da usare, ecc.? Certamente non è completo e apparentemente non supportato. Dico, vado con CoreData e sintonizzo le prestazioni quando (se) si fa male – melfar

+0

Durante la revisione delle mie app per perdite, non ho mai trovato nessuno all'interno della libreria. – pgb

+0

Questo potrebbe essere un link migliore http://code.google.com/p/flycode/source/browse/#svn/trunk/fmdb –

6

Fuori della parte superiore della mia testa:

  • utilizzare le transazioni.
  • Assicurati che SQL sfrutti le tabelle nello correct order.
  • Non aggiungere indici di cui non sei sicuro di aver bisogno.

Forse non solo specifico per iPhone ma per dispositivi integrati ci sono alcuni ottimi consigli here.

Questo link appartiene a una versione precedente di SQLite ma risulta comunque utile.

Infine questo Stack Question ha anche alcune buone informazioni.

Utilizziamo SQLite con un'applicazione .Net Compact Framework al momento e le prestazioni sono fantastiche e abbiamo dedicato un po 'di tempo all'ottimizzazione, ma non quasi quanto potevamo.

Buona fortuna.

8

Misura l'ingombro della memoria della tua app e cerca eventuali perdite negli strumenti. Poi provarlo dopo aver richiamato sqlite3_exec con:

  • pragma cache_size=1

e/o

  • pragma synchronous=0

YMMV. Ci sono rapporti di aumenti delle prestazioni, grandi riduzioni nell'utilizzo della RAM e meno perdite. Tuttavia, fai attenzione a fare le regolazioni senza comprenderne l'impatto (ad esempio, synchronous disattiva lo svuotamento che accelera di molto le cose, ma può causare danni al DB se il telefono viene spento e riacceso al momento sbagliato).

Maggiori informazioni qui: http://www.sqlite.org/pragma.html

+1

+1 per questo cache_size può consumare un bel po 'di memoria su iphone e mi ci è voluto un po 'prima di aver trovato questo. – paulthenerd

3

ho scoperto che è spesso più veloce per ottenere solo gli ID che cerco in una query complessa e quindi ottenere il resto delle informazioni su richiesta.

Così, per esempio:

SELECT person_id 
    FROM persons 
WHERE (complex where clause) 

e poi come viene visualizzato ogni persona Corro

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

Io di solito trovare questo rende il complesso query eseguita in 1/2 del tempo e le ricerche per una determinata persona sono in genere dell'ordine di 2 ms (questo è su tabelle con righe 17k).

La tua esperienza può variare e dovresti cronometrare le cose da solo.

Inoltre, devo dare credito a Wil Shipley per aver suggerito questa tecnica nel suo discorso qui: http://www.vimeo.com/4421498.

Uso effettivamente il modello di idratazione/disidratazione ampiamente dai sqlitebook che è un superset di questa tecnica.

1

Io sono pigro e piace a bastone nel codice di base, per quanto possibile, quindi mi piacciono le SQLitePersistentObjects strumento ORM:

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

fate i vostri oggetti del modello del dominio ereditano da SQLitePersistentObject (ok un po ' invadente) e quindi puoi persistere/recuperare i tuoi oggetti secondo necessità.

a persistere:

[person save]; 

caricarla di nuovo in è quasi facile. Qualsiasi oggetto persistibile ottiene i metodi dinamici della classe aggiunti per consentire la ricerca. Quindi, potremmo recuperare tutti gli oggetti Person che avevano un cognome "Rossi" in questo modo:

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

Un altra opzione che non ho ancora provato è Core Data (necessità di essere un iPhone Dev Apple), anche se la sua una caratteristica 3.0 e quindi dipende dalla vostra applicazione se questo è un'opzione ..

+0

Tutte le richieste di app attuali richiedono di essere compilate con l'SDK 3.0, quindi direi che Core Data è probabilmente l'opzione migliore. –

+0

A quanto ho capito, la presentazione non ha bisogno di essere compilata con 3.0, sarà solo testata contro di essa: "tutte le comunicazioni all'App Store saranno esaminate sull'ultima versione beta di iPhone OS 3.0. compatibile con iPhone OS 3.0, non sarà approvato. " –

Problemi correlati