la recommandation d'Apple est de ne pas stocker blob de bases de données SQLite qui sont plus grandes que ~ 2 kilo-octets.
SQLite organise des bases de données dans les pages. Chaque page est de 4 kilo-octets en taille. Lorsque vous lisez des données à partir du fichier de base de données SQLite il charge ces pages dans un cache de page interne. Sur l'iPhone, je pense que ce défaut de cache à 1 méga-octet en taille. Cela rend la lecture des enregistrements adjacents très vite, car ils seront probablement dans le cache de page déjà.
Lorsque SQLite lit votre dossier de base de données en mémoire, il lit l'enregistrement et toutes les pages qu'il occupe. Donc, si votre dossier contient un blob, il pourrait occuper plusieurs pages et vous serez éjecter les pages existantes du cache et de les remplacer par les pages de votre dossier blob.
Ce n'est pas si mal si vous êtes juste à travers la numérisation et le chargement tout votre BLOBS faire quelque chose avec eux (les afficher par exemple). Mais si vous avez fait dire une requête où vous vouliez juste pour obtenir des données qui sont dans la même ligne que le blob cette requête serait beaucoup plus lent que si le dossier ne contenait pas le grand blob.
Donc, au minimum, vous devez stocker vos données BLOB dans un tableau distinct. Par exemple:
CREATE TABLE blobs ( id INTEGER PRIMARY KEY, data BLOB );
CREATE TABLE photos ( id INTEGER PRIMARY KEY, name TEXT, blob_id INTEGER,
FOREIGN KEY(blob_id) REFERENCES blobs(id) );
Ou mieux encore, stocker les données BLOB sous forme de fichiers en dehors de la base de données SQLite.
Notez qu'il est possible de modifier la taille du cache de page avec des instructions SQL PRAGMA (si vous ne l' utilisez CoreData).