CoreData について調べていると、SugarRecord というライブラリーがあることがわかり、使ってみることにしました。
SugarRecord は、CoreData のラッパーであり、Realm のラッパーでもあります
CocoaPods
CocoaPods をインストール
SugarRecord は、CocoaPods を利用しているので、CocoaPods をインストールします。Swift も使える状態になったので、思い出しつつ...
$ gem install cocoapods
$ pod --version
0.36.4
Xcode でプロジェクトを作る
Xcode でプロジェクトを作ります。「TestAppCocoaPods01」という名前にしおきます。
作るときに「Use Cocoa Data」にチェックを入れます
$ cd
$ pwd
/Users/user_name/TestAppCocoaPods01
$ pod init
Podfile を用意
$ pwd
/Users/user_name/TestAppCocoaPods01
$ vi Podfile
Podfile を編集
SugarRecord 以外も今回はインストール。
Podfile
target 'TestAppCocoaPods01' do
use_frameworks!
pod 'Alamofire', :git => "https://github.com/Alamofire/Alamofire.git"
pod 'SwiftyJSON', :git => "https://github.com/SwiftyJSON/SwiftyJSON.git"
pod 'SugarRecord/CoreData', :git => 'https://github.com/SugarRecord/SugarRecord.git'
end
target 'TestAppCocoaPods01' do
use_frameworks!
pod 'Alamofire', :git => "https://github.com/Alamofire/Alamofire.git"
pod 'SwiftyJSON', :git => "https://github.com/SwiftyJSON/SwiftyJSON.git"
pod 'SugarRecord/CoreData', :git => 'https://github.com/SugarRecord/SugarRecord.git'
end
SugarRecord だとかをインストール
$ pod install
SugarRecord
CoreDataの設定
- 今回はCategoriesというモデルを用意
- configurations で class の設定をする
- [プロジェクト名].[クラス名] と設定する(理由がよくわかってない)
AppDelegate の準備
- import する
- 今回はSqlite
AppDelegate.swift
import UIKit
import CoreData
import SugarRecord
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let stack: DefaultCDStack = DefaultCDStack(databaseName: "TestAppCocoaPods01.sqlite", automigrating: true)
SugarRecord.addStack(stack)
//ログレベルを設定(任意らしい)
SugarRecordLogger.currentLevel = .logLevelError
return true
}
}
SugarRecord で取得するときのオブジェクト
Categories.swift
import Foundation
import CoreData
class Categories: NSManagedObject {
@NSManaged var name: String
func name_plus() -> NSString{
var neme_plus = self.name + "だよ"
return neme_plus
}
}
全体
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
initDataInsert()
readData()
if let category: Categories = Categories.by("name", equalTo: "foo").find().firstObject() as? Categories {
println("edit ------------")
category.beginWriting()
category.name = "fooはフーになります"
category.endWriting()
category.save()
println("------------")
}
readData()
}
// データーの取得
func readData() {
var items = Categories.all().find()
println("readData ------------")
println(items.count)
for(var i = 0; i < items.count; i++) {
var categories = items[i] as! Categories
println(categories.name_plus())
}
println("------------")
}
// データーの登録
func initDataInsert() {
let category_names: [String] = ["日記", "写真", "技術", "映画", "foo", "bar"]
for category_name in category_names {
println("------------")
println(category_name)
var categories:Categories = Categories.create() as! Categories
categories.name = category_name
var saved:Bool = categories.save()
println(saved)
println("------------")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
書き込み(保存)
save で保存できます(Active Recordっぽいです)
func initDataInsert() {
let category_names: [String] = ["日記", "写真", "技術", "映画", "foo", "bar"]
for category_name in category_names {
var categories:Categories = Categories.create() as! Categories
categories.name = category_name
var saved:Bool = categories.save()
}
}
編集
トランザクションが必要なので
- beginWriting
- endWriing
上記を利用します
if let category: Categories = Categories.by("name", equalTo: "foo").find().firstObject() as? Categories {
category.beginWriting()
category.name = "fooはフーになります"
category.endWriting()
category.save()
}
読み込み
for で回して取得
func readData() {
var items = Categories.all().find()
for(var i = 0; i < items.count; i++) {
var categories = items[i] as! Categories
}
}
環境
- Xcode 6.3.1
- swift 1.2
- iOS 8.2