苹果照片:以正确的方式从photos.db中读取人脸/人物

时间:2019-03-02 17:17:30

标签: macos sqlite photo

我正在尝试在个人项目中读取由Mac OS中包含的Photos.app生成的photos.db SQLite数据库。

但是,我在结构上苦苦挣扎,也许你们可以帮助我吗?我没有找到官方指南,所以我首先查看表结构并将数据与在Photos.app中看到的数据进行比较。

阅读相册:这似乎很容易,并且或多或少与查询RKAlbums表有关。

SELECT * FROM RKAlbum WHERE RKAlbum.albumSubclass = 3 AND RKAlbum.isInTrash = 0

从相册中读取照片:看起来也很容易,RKMaster表(照片)中或多或少都包含了所有内容,并且只需稍微研究一下stackoverflow即可。

SELECT * FROM RKMaster, RKVersion, RKAlbumVersion WHERE RKAlbumVersion.albumId = :album_id AND RKAlbumVersion.versionId = RKVersion.modelId AND RKVersion.masterId = RKMaster.modelId AND RKMaster.isInTrash = 0

读取人/面孔: RKFace和RKPerson表很容易做到:

SELECT * FROM RKPerson WHERE `name` IS NOT NULL ORDER BY `name` ASC

SELECT * FROM RKFace `f`, RKMaster `m` WHERE f.personUuid = :person_id

将面孔和照片组合在一起:这是事情开始让我感到困惑的时候。我有一张照片,可以在Photos.app中看到,也可以在RKMaster表中的als查询中查看。在该照片上,有一个人的脸,我也可以在Photos.app中看到它。但是,我在RKFace.imageModelId中找不到RKMaster.modelId。反之亦然:RKFace.imageModelId中有条目,但其中许多(不是全部)不在RKMaster.modelId中。

是否知道如何存储数据?我确定我缺少一些表来连接数据或其他东西。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这对我有用。

-- find people in a photo. specify photo name in where clause
select versions.*, persons.displayName, masters.imagePath from RKMaster masters
inner join RKVersion versions on versions.masterUuid = masters.uuid
inner join RKFace faces on faces.imageModelId = versions.modelId
inner join RKPerson persons on persons.modelId = faces.personId
where imagePath like '%P7251558.JPG';