web-dev-qa-db-ja.com

Realmデータベースに画像を配置する方法は?

Swift 2を使用してiOSアプリケーションを作成していますが、アカウントのプロフィール写真をRealmデータベースにローカルに保存したいと思います。ドキュメントやそれについて話している人は見つかりません。

出来ますか?そしてどうやって?

それをするのは悪いのでしょうか?

25
VivienG

画像は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 のようなこの目的のためのライブラリを使用することをお勧めします。

50
ProblemSlover

ProblemSloverのソリューションはSwift 2.2で更新されました:

重要な注意:唯一の変更点は、Swift 2.1の時点でstringByAppendingPathComponentが削除されたため、次のエラーが表示されることです。

stringByAppendingPathComponentは使用できません:代わりにNSURLでURLByAppendingPathComponentを使用してください。

迷惑かもしれませんが、理由により削除されているため、代わりにNSURLを使用するようAppleの推奨事項に従う必要があることに注意してください。 [〜#〜] 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)
    }
}
4
Geoherna