Подтвердить что ты не робот

Как поместить изображение в базу данных Realm?

Я пишу приложение iOS с помощью Swift 2, и я хотел бы сохранить изображение профиля в локальной базе данных в Realm. Я не могу найти никакой документации или людей, говорящих об этом.

Возможно ли это? И как?

Может быть, это плохо сделать?

4b9b3361

Ответ 1

Изображения можно хранить как 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 или AlamofireImage.

Ответ 2

Решение проблемыSlover обновлено для Swift 2.2:

Важное примечание: единственное изменение в том, что теперь stringByAppendingPathComponent был удален с Swift 2.1, поэтому вы получите сообщение об ошибке:

stringByAppendingPathComponent недоступен: вместо этого используйте URLByAppendingPathComponent в NSURL.

Пожалуйста, имейте в виду, что, хотя это может раздражать, оно было удалено по какой-либо причине, и вы должны следовать рекомендациям яблока, чтобы использовать NSURL. НО, если вы хотите продолжить это решение, исправление для 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)
    }
}