1

我的用例是一个带有本地反应的移动应用程序,但我想这是非常常见的良好做法。

我希望能够在应用程序中拍摄图像(从相机或画廊),并能够存储它,以便可以从添加日期或用户添加的一些元数据中获取它。

该理论似乎很简单,一种方法可以是:

  • 使用任何库(例如这个很棒的库)来获取图像,
  • 将图像存储为 base64 和元数据,比方说RealmJS(一些内部数据库),
  • 查询这个数据库以获得我想要的。

这应该有效,并且应该很容易实现。但我想知道一些事情:

  • 根据智能手机相机的性能,将其存储为base64(并且没有校验和,使用更多内存......)不是很可惜吗?
  • 这种格式,base64,一般来说存储图像不是一个坏主意吗?
  • 将图像存储在 RealmJS 中是否是个好主意,因为用户重复使用图像(在 facebook 上分享...)会很痛苦,但另一方面,如果我将其写入智能手机并存储一个 URI,它可能会导致很多问题(如果用户删除它会丢失文件,需要访问内存,...)
  • 这种方法是否“干净”(好吧,它有效,但是......)?

如果您有任何经验、技巧或好的做法可以分享,我会很乐意谈论它:)

4

1 回答 1

1

您可以在 Realm 中存储二进制数据(图像)。但是如果你在本地使用 Realm(不是同步),我会建议你将图像存储在文件系统中,并将路径存储在 Realm 中。您的模型可能类似于:

const ImageSchema = {
    name: 'Image',
    properties: {
        path: 'string',
        created: 'Date',
        modified: 'Date?',
        tags: 'Tag[]'
     }
 };

 const TagSchema = {
     name: 'Tag',
     properties: {
         name: 'string',
         images: { type: 'linkingObjects', objectType: 'Image', property: 'tags' }
     }
};

也就是说,对于每个图像,都会存储其创建的时间戳。此外,如果图像已被修改,它还有一个可选的时间戳。该属性path是找到图像的位置。如果您更喜欢存储图像,则可以改用 type 属性data。要查找不到一周的图像,您可以使用realm.objects('Image').filtered('created >= $1', new Date(Date.now()-7*24*60*60)).

只是为了好玩,我为每张图片添加了标签列表。linkingObjectinTag可以找到所有具有特定标签的图像,例如realm.objects('Tag').filtered('@links.Tag.name == "Dog"').

于 2018-07-09T07:41:06.167 回答