最近,我正在考虑将我的应用数据从Core Data迁移到Realm。
但令我担心的是,Realm中没有任何属性称为:允许外部存储。我制作的有很多图像的应用程序需要保存。因此,我认为在Realm中以Data
类型保存这些图像不是一个好主意,尽管所有这些图像都小于2MB(每个图像)。
所以,我的问题是:
Data
是个好主意吗? (每张图片少于2MB,但有很多图片) String
类型映射它们。我想使用新的Type(例如RealmImage) class Person: Object {
var name: String
var avatar: ObjectWithImage
}
class ObjectWithImage : RealmObject {
var imageUrl: String
}
没有这个:
class Person: Object {
var imageUrl: String
}
因此,我不想仅将图像文件路径保存为String
类型。我想要做的是创建一个新类型(例如ObjectWithImage
或类似的一些),它将包含图像的文件路径。原因是因为我也在使用 CloudKit 。因此,我必须使用 CloudKit 类型映射所有Realm类型。如果它是String
类型,它将与原始String
类型冲突。
问题是CKAsset
。我想要的是它可以支持CKAsset
和ObjectWithImage
可以使用CKAsset
进行映射。
下面的代码是其他类型的示例代码,我想在下面的代码中支持CKAsset
。
public protocol CKRecordRecoverable {
associatedtype O: Object
}
extension CKRecordRecoverable {//Mapping from CKRecord
func parseFromRecord(record: CKRecord) -> O? {
let o = O()
var recordValue: Any?
for prop in o.objectSchema.properties {
switch prop.type {
case .int:
recordValue = record.value(forKey: prop.name) as? Int
case .string:
recordValue = record.value(forKey: prop.name) as? String
case .bool:
recordValue = record.value(forKey: prop.name) as? Bool
case .date:
recordValue = record.value(forKey: prop.name) as? Date
case .float:
recordValue = record.value(forKey: prop.name) as? Float
case .double:
recordValue = record.value(forKey: prop.name) as? Double
case .data:
recordValue = record.value(forKey: prop.name) as? Data
default:
print("Other types will be supported in the future.")
}
o.setValue(recordValue, forKey: prop.name)
}
return o
}
}
public var record: CKRecord {
let r = CKRecord(recordType: Self.recordType, recordID: recordID)
let properties = objectSchema.properties
for prop in properties {//Mapping to CloudKit type
r[prop.name] = self[prop.name] as? CKRecordValue
}
return r
}
那么,有什么想法吗?
-----------编辑-------------
根据评论,我认为第二种选择是一种好方法:将图像保存到本地文件存储中。
任何人都可以帮我思考如何使用CKRecord
在parseFromRecord
和record
方法中。定义新类型以处理图像并将图像保存到本地文件存储中。
我现在对此一无所知。非常感谢你。
我从这个链接得到了一个理由:Why is it recommended practice to store images on disk rather than in a Realm 。
但仍想知道如何制作......
答案 0 :(得分:0)
当您看到Allows External Storage
单词"外部"的CoreData复选框时并不意味着它存储在云端或设备之外的其他位置。它只是意味着它可以存储在持久存储之外的文件中。
换句话说,即使您选中Allows External Storage
,您的照片仍会占用用户设备的空间。