Help us understand the problem. What is going on with this article?

Swiftでデータベースを使おう!①(保存・取得・更新・削除)

More than 1 year has passed since last update.

【お知らせ】Swift3に対応しました!(2017/02/23更新)

【Swift×mBaaS】シリーズ概要

  • Swiftでニフクラmobile backend(通称:mBaaS)を使ってSwiftで開発を始めたい人向けのドキュメントです。
  • ニフクラmobile backendのiOS(Objectiv-C SDK)用ドキュメントSwift用に書き換えて動かしてみたものをまとめました。
  • 初心者でもわかりやすいよう心掛けて作っていますが、わかりにくい部分がありましたらコメントをいただければ訂正しますのでお気軽にご意見をお願いします^^*
  • 今回は<データストア編>として保存取得更新削除について説明します!

事前準備のお願い

ドキュメントの動作確認方法

  • AppDelegate.swiftファイルに次のコードを書きます。
Swift3_AppDelegate.swift
import UIKit
import NCMB

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    //********** APIキーの設定 **********
    let applicationkey = "YOUR_NCMB_APPLICATIONKEY"
    let clientkey      = "YOUR_NCMB_CLIENTKEY"

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        //********** SDKの初期化 **********
        NCMB.setApplicationKey(applicationkey, clientKey: clientkey)

        /** ★ここに記述するとアプリ起動時に実行されます★ **/

        return true
    }
}
Swift2_AppDelegate.swift
import UIKit
import NCMB

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    //********** APIキーの設定 **********
    let applicationkey = "YOUR_NCMB_APPLICATIONKEY"
    let clientkey      = "YOUR_NCMB_CLIENTKEY"

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        //********** SDKの初期化 **********
        NCMB.setApplicationKey(applicationkey, clientKey: clientkey)

        /** ★ここに記述するとアプリ起動時に実行されます★ **/

        return true
    }
}
  • 2つのAPIキーをニフクラmobil backendのダッシュボード上からコピーして書き換えてください。(※アプリケーションキーとクライアントキーをそれぞれ「YOUR_NCMB_APPLICATIONKEY」と「YOUR_NCMB_CLIENTKEY」の部分に書きます。)
  • 【Swift×mBaaS】クイックスタートを作ってみました!<CocoaPods編>で設定をしてからこのページを見ている方は、AppDelegate.swiftに記述する部分が重複しますが、こちらの内容に書き換えてください。
  • 上のコードの中央付近に「/** ★ここに記述するとアプリ起動時に実行されます★ **/」と書きましたが、ここに書かれた内容はアプリの起動時に実行されます。以下のSwiftドキュメントもここに書けば気軽に動作確認できます。

Swiftでデータベースを使おう!

  • データストアの機能はNCMBObjectを通じて利用します。
  • それぞれコードの実行をし、ニフクラmobile backendのダッシュボードで確認をしながら動作確認をしてください。

オブジェクトを保存する

  • 非同期での保存の場合にはsaveInBackgroundWithBlockメソッドを使います。
    • TestClass:保存用クラス名(※クラスが存在しない場合は新規でクラスが作成されます。)
    • key, number, array:フィールド名
    • value, 1, ["A", "B", "C"]:保存する値(※データ型は文字列、配列、数字、日付、真偽値、オブジェクト、緯度経度が利用可能)
Swift3
// クラスのNCMBObjectを作成
let obj = NCMBObject(className: "TestClass")
// オブジェクトに値を設定
/** 文字列 **/
obj?.setObject("value", forKey: "key")
/** 数値 **/
obj?.setObject(1, forKey: "number")
/** 配列 **/
obj?.setObject(["A", "B", "C"], forKey: "array")

// データストアへの保存を実施
obj?.saveInBackground({ (error) in
    if error != nil {
        // 保存に失敗した場合の処理
    }else{
        // 保存に成功した場合の処理
    }
})
Swift2
// クラスのNCMBObjectを作成
let obj = NCMBObject(className: "TestClass")
// オブジェクトに値を設定
/** 文字列 **/
obj.setObject("value", forKey: "key")
/** 数値 **/
obj.setObject(1, forKey: "number")
/** 配列 **/
obj.setObject(["A", "B", "C"], forKey: "array")

// データストアへの保存を実施
obj.saveInBackgroundWithBlock { (error: NSError!) -> Void in
    if error != nil {
        // 保存に失敗した場合の処理
    }else{
        // 保存に成功した場合の処理
    }
}

通信状況をチェックしてオブジェクトを保存する

  • 通信状況をチェックして保存処理を行う場合はsaveEventuallyメソッドを使います。
    • オンライン時:saveInBackgroundWithBlockメソッドが実行されます。
    • オフライン時:保存処理は行われず、次にオンラインになったときに保存処理が行われる。
Swift3
// クラスのNCMBObjectを作成
let obj2 = NCMBObject(className: "TestClass")
// オブジェクトに値を設定
obj2?.setObject("value2", forKey: "key")
// データストアへの保存を実施
obj2?.saveEventually({ (error) in
    if error != nil {
        // 保存に失敗した場合の処理
    }else{
        // 保存に成功した場合の処理
    }
})
Swift2
// クラスのNCMBObjectを作成
let obj2 = NCMBObject(className: "TestClass")
// オブジェクトに値を設定
obj2.setObject("value2", forKey: "key")
// データストアへの保存を実施
obj2.saveEventually { (error: NSError!) -> Void in
    if error != nil {
        // 保存に失敗した場合の処理
    }else{
        // 保存に成功した場合の処理
    }
}

オブジェクトを取得する

  • objectIdを指定して、指定したデータを取得します。
  • fetchInBackgroundWithBlockメソッドを利用します。
  • オブジェクトの取得は「オブジェクトの検索」を使う方法もあります。こちらについては<データストア編②>で説明します。
Swift3
// クラスのNCMBObjectを作成
let obj3 = NCMBObject(className: "TestClass")
// objectIdプロパティを設定
obj3?.objectId = "***検索するデータのobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj3?.fetchInBackground({ (error) in
    if error != nil {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        // (例)取得したデータの出力
        print(obj3! as NCMBObject)
    }
})
Swift2
// クラスのNCMBObjectを作成
let obj3 = NCMBObject(className: "TestClass")
// objectIdプロパティを設定
obj3.objectId = "***検索するデータのobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj3.fetchInBackgroundWithBlock { (error: NSError!) -> Void in
    if error != nil {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        // (例)取得したデータの出力
        print(obj3)
    }
}
  • 「***検索するデータのobjectId***」の部分は検索対象のobjectIdを書いてください。

オブジェクトの更新

  • 更新は、保存したデータに新しい値をセットしてsaveInBackgroundWithBlockメソッドを実行して保存する流れで行います。

例1:指定したフィールド(数値)の値をインクリメントする

  • incrementKeyメソッドを使います。
  • 以下はオブジェクトの取得と同様にobjectIdを指定して、そのデータの指定したフィールドの値(数値)をインクリメントするサンプルです。
Swift3
/** オブジェクトの更新(フィールドの値をインクリメントする) **/
// クラスのNCMBObjectを作成
let obj4 = NCMBObject(className: "TestClass")
// objectIdプロパティを設定
obj4?.objectId = "***更新するデータのobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj4?.fetchInBackground({ (error) in
    if error != nil {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        // 指定フィールドの値をインクリメントする
        obj4?.incrementKey("number")
        obj4?.saveInBackground({ (error) in
            if error != nil {
                // 更新に失敗した場合の処理
            }else{
                // 更新に成功した場合の処理
                // (例)更新したデータの出力
                print(obj4! as NCMBObject)
            }
        })
    }
})
Swit2
/** オブジェクトの更新(フィールドの値をインクリメントする) **/
// クラスのNCMBObjectを作成
let obj4 = NCMBObject(className: "TestClass")
// objectIdプロパティを設定
obj4.objectId = "***更新するデータのobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj4.fetchInBackgroundWithBlock { (error: NSError!) -> Void in
    if error != nil {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        // 指定フィールドの値をインクリメントする
        obj4.incrementKey("number")
        obj4.saveInBackgroundWithBlock({ (error: NSError!) -> Void in
            if error != nil {
                // 更新に失敗した場合の処理
            }else{
                // 更新に成功した場合の処理
                // (例)更新したデータの出力
                print(obj4)
            }
        })
    }
}
  • インクリメントなので、フィールドの値を「1」と保存しているデータであれば、上のサンプルを実行すると「2」になります。「2」なら「3」になります。

例2:指定したフィールド(配列)の要素がユニークになるように値を追加する

  • addUniqueObjectsFromArrayメソッドを使います。
  • 以下はオブジェクトの取得と同様にobjectIdを指定して、そのデータの指定したフィールドの値(配列)の要素がユニークになるように値を追加するサンプルです。
Swift3
let obj5 = NCMBObject(className: "TestClass")
obj5?.objectId = "***更新するobjectId***"
obj5?.fetchInBackground({ (error) in
    if error != nil {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        // フィールドの値(配列)の要素がユニークになるように値を追加する
        obj5?.addUniqueObjects(from: ["A", "D", "F"], forKey: "array")
        obj5?.saveInBackground({ (error) in
            if error != nil {
                // 保存に失敗した場合の処理
            }else{
                // 保存に成功した場合の処理
            }
        })
    }
})
Swift2
let obj5 = NCMBObject(className: "TestClass")
obj5.objectId = "***更新するobjectId***"
obj5.fetchInBackgroundWithBlock { (error: NSError!) -> Void in
    if error != nil {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        // フィールドの値(配列)の要素がユニークになるように値を追加する
        obj5.addUniqueObjectsFromArray(["A", "D", "F"], forKey: "array")
        obj5.saveInBackgroundWithBlock({ (error: NSError!) -> Void in
            if error != nil {
                // 保存に失敗した場合の処理
            }else{
                // 保存に成功した場合の処理
            }
        })
    }
}
  • フィールドの値を["A", "B", "C"]と保存しているデータであれば、上のサンプルでは["A", "D", "F"]を追加するので、["A", "B", "C", "D", "F"]に更新されます。

オブジェクトの削除

  • 非同期で削除する場合は、deleteInBackgroundWithBlockメソッドを利用します。
  • 以下はオブジェクトの取得、更新と同様にobjectIdを指定して、削除を行うサンプルです。
Swift3
// testクラスへのNCMBObjectを設定
let obj6 = NCMBObject(className: "TestClass")
// objectIdプロパティを設定
obj6?.objectId = "***更新するobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj6?.fetchInBackground({ (error) in
    if error != nil {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        obj6?.deleteInBackground({ (error) in
            if error != nil {
                // 削除に失敗した場合の処理
            }else{
                // 削除に成功した場合の処理
            }
        })
    }
})
Swift2
// testクラスへのNCMBObjectを設定
let obj6 = NCMBObject(className: "TestClass")
// objectIdプロパティを設定
obj6.objectId = "***更新するobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj6.fetchInBackgroundWithBlock({ (error: NSError!) -> Void in
    if error != nil {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        obj6.deleteInBackgroundWithBlock({ (error: NSError!) -> Void in
            if error != nil {
                // 削除に失敗した場合の処理
            }else{
                // 削除に成功した場合の処理
            }
        })
    }
})

参考

natsumo
ニフクラ mobile backend の使い方をまとめています。
https://github.com/natsumo/
fjct
クラウド・IoT 関連サービスを開発・提供している企業です。(こちらは、富士通クラウドテクノロジーズの有志にて運営しております。)
https://fjct.fujitsu.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした