Swift3.0のcore dataでCRUD!

  • 16
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Swift3.0でcoredata使ってわさわさするコードをまとめました!
プロジェクト作る際に、Use Core Dataにチェックをつけていない体で進めていきます!

準備編

core dataのファイルを作っている場合は飛ばしてしまいましょう!

core dataのファイルを作る

プロジェクトのディレクトリを右クリック > New File... > Core Data > Data Model
を選択して、適当に名前(ここではMyModel.xcdatamodeldとしておきましょう)を決めて保存する。

EntityとAttributeの準備

MyModel.xcdatamodeldをいじっていきます!
Add EntityAdd Attributeで作っていけばいいだけなので説明は割愛します。
とりあえず、EntityとしてTweet、Attributeとしてbody(String型)・created_at(Date型)を作ったことにしておきます。

Entityとの接続に必要なファイルを生成する

MyModel.xcdatamodeldを開いた状態で、
上のメニューバー > Editor > Create NSManagedObject Subclass
を選択する。
ここも全チェックをつけてNextしていけば終わるので細かな説明は、はしょります。

2つのファイルが出来上がっているはずです!

Tweet+CoreDataClass.swift
import Foundation
import CoreData


public class Tweet: NSManagedObject {

}
Tweet+CoreDataProperties.swift
import Foundation
import CoreData


extension Tweet {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Tweet> {
        return NSFetchRequest<Tweet>(entityName: "Tweet");
    }

    @NSManaged public var body: String?
    @NSManaged public var created_at: NSDate?

}

core dataとの接続に必要なコードを追加する

今回は、Use Core Dataにチェックつけなかった体で進めているので、チェックつけた時に自動生成されるコードを自分で追加します。
AppDelegate.swiftのAppDelegateクラスに次のメソッドを追加します!

AppDelegate.swift
    // MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentContainer = {
        /*
         The persistent container for the application. This implementation
         creates and returns a container, having loaded the store for the
         application to it. This property is optional since there are legitimate
         error conditions that could cause the creation of the store to fail.
         */
        let container = NSPersistentContainer(name: "MyModel") //ここを作ったcore dataのファイル名に変更(拡張子不要)
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

                /*
                 Typical reasons for an error here include:
                 * The parent directory does not exist, cannot be created, or disallows writing.
                 * The persistent store is not accessible, due to permissions or data protection when the device is locked.
                 * The device is out of space.
                 * The store could not be migrated to the current model version.
                 Check the error message to determine what the actual problem was.
                 */
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    // MARK: - Core Data Saving support

    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

ここから本題

ViewControllerimport CoreDataを忘れずに追加しておきましょう!

Create(レコードの新規作成)

let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
let viewContext = appDelegate.persistentContainer.viewContext
let tweet = NSEntityDescription.entity(forEntityName: "Tweet", in: viewContext)
let newRecord = NSManagedObject(entity: tweet!, insertInto: viewContext)
newRecord.setValue("値", forKey: "body") //値を代入
newRecord.setValue(Date(), forKey: "created_at")//値を代入

do {
    try mapper.save()
} catch {
}

Read(レコードの読み出し)

let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
let viewContext = appDelegate.persistentContainer.viewContext
let query: NSFetchRequest<Tweet> = Tweet.fetchRequest()

do {
    let fetchResults = try viewContext.fetch(query)
    for result: AnyObject in fetchResults {
        let body: String? = result.value(forKey: "body") as? String
        let created_at: Date? = result.value(forKey: "created_at") as? Date
    }
} catch {
}

Update(レコードの更新)

SQLのように、フェッチしてごっそりと書き換えていきます!うまく検索を行いましょう!

let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
let viewContext = appDelegate.persistentContainer.viewContext
let request: NSFetchRequest<Tweet> = Tweet.fetchRequest()
do {
    let fetchResults = try viewContext.fetch(request)
    for result: AnyObject in fetchResults {
        let record = result as! NSManagedObject
        record.setValue(Date(), forKey: "created_at")
    }
    try viewContext.save()
} catch {
}

Delete(レコードの削除)

これもSQLのように、フェッチしてごっそりと削除を行います。

let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
let viewContext = appDelegate.persistentContainer.viewContext
let request: NSFetchRequest<Tweet> = tweet.fetchRequest()
do {
    let fetchResults = try viewContext.fetch(request)
    for result: AnyObject in fetchResults {
        let record = result as! NSManagedObject
        viewContext.delete(record)
    }
    try viewContext.save()
} catch {
}