反应(本机)图像存储/获取良好做法

时间:2018-07-07 18:38:40

标签: reactjs image react-native realm

我的用例是一个具有本机反应的移动应用程序,但我想这是非常普遍的良好做法。

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

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

  • 使用任何库(例如this great one)获取图像,
  • 将图像作为base64和元数据存储在RealmJS(某些内部数据库)中,
  • 查询此数据库以获取我想要的内容。

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

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

如果您有任何经验,技巧或好的做法可以分享,我将很乐意与您讨论:)

1 个答案:

答案 0 :(得分: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是查找图像的位置。如果您想存储图像,则可以使用类型data的属性。要查找不到一周的图像,可以使用realm.objects('Image').filtered('created >= $1', new Date(Date.now()-7*24*60*60))

只是为了好玩,我为每个图像添加了一个标签列表。 linkingObject中的Tag可以查找所有带有特定标签(例如realm.objects('Tag').filtered('@links.Tag.name == "Dog"'))的图像。