Apple 的建议是不要将 BLOB 存储在大于 ~2 KB 的 SQLite 数据库中。
SQLite 将数据库组织成页面。每页大小为 4 KB。当您从 SQLite 数据库文件中读取数据时,它会将这些页面加载到内部页面缓存中。在 iPhone 上,我认为这个缓存的大小默认为 1 兆字节。这使得读取相邻记录非常快,因为它们可能已经在页面缓存中。
当 SQLite 将您的数据库记录读入内存时,它会读取整个记录以及它占用的所有页面。因此,如果您的记录包含 BLOB,它可能会占用许多页面,您将从缓存中弹出现有页面并用 BLOB 记录的页面替换它们。
如果您只是扫描并加载所有 BLOBS 以对它们执行某些操作(例如显示它们),这还不错。但是,如果说您执行了一个查询,您只是想获取一些与 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 数据库之外的文件。
请注意,可以使用SQL PRAGMA 语句调整页面缓存大小(如果您不使用 CoreData)。