Σύσταση της Apple δεν είναι να αποθηκεύσετε BLOB σε SQLite βάσεις δεδομένων που είναι μεγαλύτερα από ~ 2 kilobytes.
SQLite οργανώνει βάσεις δεδομένων στις σελίδες. Κάθε σελίδα είναι 4 kilobytes σε μέγεθος. Όταν διαβάσει δεδομένα από το αρχείο της βάσης δεδομένων SQLite φορτώνει τις σελίδες σε μια εσωτερική μνήμη cache της σελίδας. Στο iPhone νομίζω ότι αυτό κρυφής μνήμης προεπιλογές για 1 megabyte σε μέγεθος. Το γεγονός αυτό καθιστά την ανάγνωση δίπλα αρχεία πολύ γρήγορα, διότι θα είναι κατά πάσα πιθανότητα στη μνήμη cache σελίδα ήδη.
Όταν SQLite διαβάζει το αρχείο βάσεων δεδομένων σας στη μνήμη διαβάζει ολόκληρο το αρχείο και όλες τις σελίδες που καταλαμβάνει. Έτσι, αν το αρχείο σας περιέχει μια σταγόνα, θα μπορούσε να καταλάβει πολλές σελίδες και θα εξάγει τις υπάρχουσες σελίδες από τη μνήμη cache και την αντικατάστασή τους με τις σελίδες ρεκόρ BLOB σας.
Αυτό δεν είναι τόσο κακό, αν είστε απλά σάρωση μέσω και τη φόρτωση όλων των σταγόνες σας για να κάνετε κάτι μαζί τους (εμφάνιση τους, για παράδειγμα). Αλλά αν πούμε ότι κάναμε ένα ερώτημα στο οποίο θα ήθελα να πάρετε κάποια δεδομένα που είναι στην ίδια σειρά με το BLOB αυτό το ερώτημα θα ήταν πολύ πιο αργή από ό, τι αν το αρχείο δεν περιέχει το μεγάλο BLOB.
Έτσι, κατ 'ελάχιστο θα πρέπει να αποθηκεύσετε τα δεδομένα BLOB σας σε έναν ξεχωριστό πίνακα. Π.χ:
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) );
Ή ακόμα καλύτερα, να αποθηκεύσει τα δεδομένα BLOB ως αρχεία έξω από τη βάση δεδομένων SQLite.
Σημειώστε ότι μπορεί να είναι δυνατόν να αλλάξουν το μέγεθος σελίδας μνήμης cache με δηλώσεις SQL PRAGMA (αν δεν χρησιμοποιείτε CoreData).