SugarRecord（Swift 1.2）を使ってCoreDataの操作を楽にしてみる

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 以外も今回はインストール。

```ruby: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 の設定をする
* [プロジェクト名].[クラス名] と設定する（理由がよくわかってない）

![preview_01.png](https://qiita-image-store.s3.amazonaws.com/0/21321/92c5caa9-b1a8-0be4-42e6-9ef230dca321.png)


## AppDelegate の準備

* import する
* 今回はSqlite

```swift: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 で取得するときのオブジェクト

```swift: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
    }
}
```

# 全体

```swift
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っぽいです）

```swift
    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

上記を利用します

```swift
if let category: Categories = Categories.by("name", equalTo: "foo").find().firstObject() as? Categories {
  category.beginWriting()
  category.name = "fooはフーになります"
  category.endWriting()
  category.save()
}
```

## 読み込み

for で回して取得

```swift
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