🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1402閲覧

SwiftでRealmに保存したData型を元の型に戻す際にエラーが出てしまいます

pic73

総合スコア2

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/12/17 06:38

お世話になります。Swiftの初心者です。皆様のお知恵をお借りしたと思います。
swiftの手書きのデータ(PKDrawing)をRealmに保存しようとしています。
PKDrawingデータを直接保存する事ができないのでData型に変換し保存しています。
しかしRealmから取り出し、元に戻す(Data→PKDrawing)を行う時、エラーが発生します。
エラーがでる箇所(以下のloadの所で発生します)
let decodeDrawing = reDrawData.withUnsafeBytes{$0.load(as: PKDrawing.self)}
エラー内容
Thread 1: EXC_BAD_ACCESS (code=1, address=0xaf6a941e0)

試したこと
①Realmに保存、すぐに読出し、Data→PKDrawing変換をしてみたら、正常に動作します。(ボタンを1タップでrealm保存、読出しを行う)
②読出し専用のボタンの時にエラーが発生します。

①と②の読出し用の関数は同じです(getDrawing)
なにとぞご教授いただけますようお願い致します。

SWIFT

1class CanvasSaveModel : Object{ 2 @objc dynamic var id : String = "" //固有ID 3 @objc dynamic var name :String = "" //canvasの名前 4 @objc dynamic var drawData = Data() //Data型に変換したPKDrawing 5 override static func primaryKey() -> String? { 6 return "id" 7 } 8} 9//Realmから読出し&Data→PKDrawing変換コード 10func getDrawing(id: String)->PKDrawing? { 11 let realm = try! Realm() 12 let reCanvasSaveModel = realm.object(ofType: CanvasSaveModel.self, forPrimaryKey: id) 13 14 guard let _reCanvasSaveModel = reCanvasSaveModel else {return nil} 15 print("_reCanvasSaveModel(_reCanvasSaveModel)") 16 17 //drawingデータをstringからPKDrawingにする 18 let reDrawData = _reCanvasSaveModel.drawData 19 //Data→PKDrawing*****ここでエラーが出ます***** 20 let decodeDrawing = reDrawData.withUnsafeBytes{$0.load(as: PKDrawing.self)} 21 22 return decodeDrawing 23} 24 25//①のコード 26@objc func onSaveLoadButton(_ sender:UIButton){ 27 let canvasSaveModel = CanvasSaveModel() 28 //***********save*********** 29 //PKDrawingデータを文字列に変換し格納 30 var drawing = canvasFirst.drawing 31 //PKDrawing→Data 32 let drawingData = Data(bytes: &drawing, count: MemoryLayout.size(ofValue: drawing)) 33 canvasSaveModel.id = "1" 34 canvasSaveModel.name = "test" 35 canvasSaveModel.drawData = drawingData 36 37 //realmインスタンス 38 let realm = try! Realm() 39 40 //idがある場合は更新。ない場合は新規保存 41 try! realm.write({ 42 realm.add(canvasSaveModel,update: .modified) 43 }) 44 //id"1"を呼び出し 45 let reDrawing = getDrawing(id: "1") 46 47 if let reDrawing = reDrawing{ 48 self.cavasSecond.drawing = reDrawing 49 } 50} 51//②のコード 52@objc func onLoadButton(_ sender: UIButton){ 53 //id"1"を呼び出し 54 let reDrawing = getDrawing(id: "1") 55 if let reDrawing = reDrawing{ 56 self.cavasSecond.drawing = reDrawing 57 } 58}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

お世話になります。自己解決しました。
AppleのPencilKitのサンプルを見て解決方法を見つけました。
ありがとうございました。

投稿2020/12/18 04:08

pic73

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問