15
15

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-05-04

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

preview_01.png

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
15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15