iOSでデータを永続化する方法としてCoreDataがありますが、コード量が多く面倒に感じる人も多いかと思います。
ここではより簡単にCoreDataを使うためにSugarRecordという便利なフレームワークを導入し、SwiftからCoreDataを使ってみます。Objective-CのMagicalRecordのような位置付けのフレームワークです。
環境
- SugarRecord 1.0.7
- Swift 1.2
- Xcode 6.3
- iOS 8.3
- CocoaPods 0.36.3
インストール
CocoaPodsを使います。
-
Podfileに以下を追記します。
pod 'SugarRecord/CoreData', :git => 'https://github.com/SugarRecord/SugarRecord.git'
-
インストールします。
pod install
初期化処理
AppDelegate.Swift
のapplication
に以下を追加します。
let stack: DefaultCDStack = DefaultCDStack(databaseName: "database.sqlite", automigrating: true)
stack.autoSaving = true
SugarRecord.addStack(stack)
//ログレベルを設定(任意)
SugarRecordLogger.currentLevel = .logLevelError
- DBとしてiOS標準のSQLiteだけでなく3rdパーティのRealmも利用可能です。
モデル作成
File -> New -> File -> iOS -> Data ModelでModel.xcdatamodeldを作成して選択します。
Add EntityでEntityを作成しAttributesにAttributeと型を設定します。
Editor -> Create NSManagedObject Subclassを選択してEntityのクラスを作成します。
-
ConfigurationsのClass欄を以下のように修正します。
変更前
PRODUCT_MODULE_NAME.[Entity名]
変更後
[プロジェクトのtarget名].[Entity名]
操作
例として以下のようなモデルのクラスを想定します。画像をCoreDataに保存する例です。
class Icon: NSManagedObject {
@NSManaged var url: String
@NSManaged var image: NSData
}
保存
if let icon:Icon = Icon.create() as? Icon {
icon.url = "http://example.com/1.png"
icon.image = image
icon.save()
}
クエリ
if let icon: Icon = Icon.by("url", equalTo: url).find().firstObject() as? Icon {
imageView.image = UIImage(data:icon.image)
}
カウント
let num:Int = Icon.count()
アップデート
if let icon: Icon = Icon.by("url", equalTo: url).find().firstObject() as? Icon {
icon.beginWriting()
icon.image = new_image
icon.endWriting()
}
参考
詳細はGitHubの公式ドキュメントに記載されています。
- セットアップ:Setup SugarRecord
- 操作:Operations