如何将图像放入 Realm 数据库?
How to put an image in a Realm database?
我正在使用 Swift 2 编写一个 iOS 应用程序,我想在 Realm 数据库中本地保存帐户的个人资料图片。我找不到任何文档或相关人员。
可能吗?以及如何?
这样做不好吗?
您可以将图像存储为 NSData
。鉴于您有图像的 URL,您希望将其存储在本地,这里是如何实现的代码片段。
class MyImageBlob {
var data: NSData?
}
// Working Example
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
var myblob = MyImageBlob()
myblob.data = imgData
let realm = try! Realm()
try! realm.write {
realm.add(myblob)
}
}
这样做可能不是个好主意?
规则很简单:
如果图片比较小,图片数量少,很少改动,可以坚持存入数据库。
如果有一堆图片,最好直接写入文件系统,只将图片的路径存储在数据库中。
这是如何做到的:
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
// Storing image in documents folder (Swift 2.0+)
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let writePath = documentsPath?.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}
请注意:这两个代码示例都不是下载图像的可靠方法,因为存在很多缺陷。在现实世界的应用程序/生产中,我建议使用专用于此目的的库,如 AFNetworking or AlamofireImage.
ProblemSlover 的解决方案已针对 Swift 2.2 更新:
重要说明: 唯一的变化是现在 stringByAppendingPathComponent
已从 Swift 2.1 中删除,因此您会收到一条错误消息:
stringByAppendingPathComponent is unavailable: use URLByAppendingPathComponent on NSURL instead.
请记住,虽然它可能很烦人,但它已被删除是有原因的,您应该按照苹果的建议改用 NSURL。 BUT 如果你想继续这个解决方案,Swift 2.1+ 的修复是显式地将 documentsPath
转换为 NSString
:
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
//Explicitly cast to NSString
let documentsPath = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString)
let writePath = documentsPath.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}
我正在使用 Swift 2 编写一个 iOS 应用程序,我想在 Realm 数据库中本地保存帐户的个人资料图片。我找不到任何文档或相关人员。
可能吗?以及如何?
这样做不好吗?
您可以将图像存储为 NSData
。鉴于您有图像的 URL,您希望将其存储在本地,这里是如何实现的代码片段。
class MyImageBlob {
var data: NSData?
}
// Working Example
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
var myblob = MyImageBlob()
myblob.data = imgData
let realm = try! Realm()
try! realm.write {
realm.add(myblob)
}
}
这样做可能不是个好主意?
规则很简单: 如果图片比较小,图片数量少,很少改动,可以坚持存入数据库。
如果有一堆图片,最好直接写入文件系统,只将图片的路径存储在数据库中。
这是如何做到的:
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
// Storing image in documents folder (Swift 2.0+)
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let writePath = documentsPath?.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}
请注意:这两个代码示例都不是下载图像的可靠方法,因为存在很多缺陷。在现实世界的应用程序/生产中,我建议使用专用于此目的的库,如 AFNetworking or AlamofireImage.
ProblemSlover 的解决方案已针对 Swift 2.2 更新:
重要说明: 唯一的变化是现在 stringByAppendingPathComponent
已从 Swift 2.1 中删除,因此您会收到一条错误消息:
stringByAppendingPathComponent is unavailable: use URLByAppendingPathComponent on NSURL instead.
请记住,虽然它可能很烦人,但它已被删除是有原因的,您应该按照苹果的建议改用 NSURL。 BUT 如果你想继续这个解决方案,Swift 2.1+ 的修复是显式地将 documentsPath
转换为 NSString
:
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
//Explicitly cast to NSString
let documentsPath = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString)
let writePath = documentsPath.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}