Kotlinでデータベースを使おう！①（保存・取得・更新・削除）

## **【Kotlin×mBaaS】シリーズ概要**
* Kotlinで ニフクラ mobile backend (通称：mBaaS)を使ってKotlinで開発を始めたい人向けのドキュメントです。
* [ ニフクラ mobile backend のAndroid(Java SDK)](http://mbaas.nifcloud.com/doc/current/#/Android)用ドキュメントを**Kotlin**用に書き換えて動かしてみたものをまとめました。
* 初心者でもわかりやすいよう心掛けて作っていますが、わかりにくい部分がありましたらコメントをいただければ訂正しますのでお気軽にご意見をお願いします。
* 今回は**＜データストア編＞**として保存・取得・更新・削除について説明します！
 * 注：「データストア」が[ ニフクラ mobile backend ](http://mbaas.nifcloud.com)の「データベース」のことです◎

##**事前準備のお願い** 
事前に ニフクラ mobile backend の登録とアプリの新規作成をし、[KotlinでmBaaSを始めよう！](https://qiita.com/nifcloud_mb/items/5b6290977f3147c3bc4f)をご覧いただき、必要な初期設定(SDKのインストールなど)をAndroid Studio上で行った上でご利用ください。

##**ドキュメントの動作確認方法**
* `MainActivity.kt` ファイルに次のコードを書きます。

```kotlin:MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.nifcloud.mbaas.core.*

//********** APIキーの設定 **********
const val applicationKey:String = "YOUR_NCMB_APPLICATIONKEY"
const val clientKey:String = "YOUR_NCMB_CLIENTKEY"

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //********** SDKの初期化 **********
        NCMB.initialize(applicationContext, applicationKey, clientKey)
    }
}
```
* ２つのAPIキーを ニフクラ mobile backend のダッシュボード上からコピーして書き換えてください。(※アプリケーションキーとクライアントキーをそれぞれ「`YOUR_NCMB_APPLICATIONKEY`」と「`YOUR_NCMB_CLIENTKEY`」の部分に書きます。)

##**Kotlinでデータベースを使おう！**
* データストアの機能はNCMBObjectを通じて利用します。
* それぞれコードの実行をし、[ ニフクラ mobile backend ](https://mbaas.nifcloud.com/)のダッシュボードで確認をしながら動作確認をしてください。

##**オブジェクトを保存する**
* 非同期での保存の場合にはsaveInBackgroundメソッドを使います。
 * TestClass：保存用クラス名（※クラスが存在しない場合は新規でクラスが作成されます。）
 * key, number, array：フィールド名
 * value, 1, ["A", "B", "C"]：保存する値（※データ型は文字列、配列、数字、日付、真偽値、オブジェクト、緯度経度が利用可能）
 
```Kotlin:Kotlin
// クラスのNCMBObjectを作成
var obj = NCMBObject("TestClass")
// オブジェクトに値を設定
/** 文字列 **/
obj.put("key", "value")
/** 数値 **/
obj.put("number", 1)
/** 配列 **/
obj.addUniqueToList("array", listOf("A","B","C"))
// データストアへの保存を実施
obj.saveInBackground { e ->
    if (e != null) {
        // 保存に失敗した場合の処理
    } else {
        // 保存に成功した場合の処理
    }
}
````

##**オブジェクトを取得する**
* objectIdを指定して、指定したデータを取得します。
* fetchInBackgroundメソッドを利用します。
* オブジェクトの取得は「オブジェクトの検索」を使う方法もあります。こちらについては[＜データストア編②＞](https://qiita.com/nifcloud_mb/items/36ddfce8294142c4d9d6)で説明します。

```kotlin:Kotlin
// クラスのNCMBObjectを作成
val obj = NCMBObject("TestClass")
// objectIdプロパティを設定
obj.objectId = "***検索するデータのobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj.fetchInBackground{  ncmbObject , e ->
    if (e != null) {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
    }
}
```

* 「***検索するデータのobjectId***」の部分は検索対象のobjectIdを書いてください。
 * objectIdは ニフクラ mobile backend のダッシュボード＞データストアから確認できます。

##**オブジェクトの更新**
* 更新は、保存したデータに新しい値をセットしてsaveInBackgroundメソッドを実行して保存する流れで行います。
 
###**例１：指定したフィールド（数値）の値をインクリメントする**
* incrementメソッドを使います。
* 以下はオブジェクトの取得と同様にobjectIdを指定して、そのデータの指定したフィールドの値(数値)をインクリメントするサンプルです。

```kotlin:Kotlin
// クラスのNCMBObjectを作成
var obj = NCMBObject("TestClass")
// objectIdプロパティを設定
obj.objectId = "***検索するデータのobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj.fetchInBackground{  obj2 , e ->
    if (e != null) {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        if( obj2 is NCMBObject){
            var obj3 = obj2 as NCMBObject
            obj3.increment("number", 1)
            obj3.saveInBackground { e2 ->
                if (e2 != null) {
                    // 保存に失敗した場合の処理
                } else {
                    // 保存に成功した場合の処理
                }
            }
        }
    }
}
```

* インクリメントなので、フィールドの値を「1」と保存しているデータであれば、上のサンプルを実行すると「2」になります。「2」なら「3」になります。

###**例２：指定したフィールド（配列）の要素がユニークになるように値を追加する**
* addUniqueToListメソッドを使います。
* 以下はオブジェクトの取得と同様にobjectIdを指定して、そのデータの指定したフィールドの値(配列)の要素がユニークになるように値を追加するサンプルです。

```kotlin:Kotlin
// クラスのNCMBObjectを作成
var obj = NCMBObject("TestClass")
// objectIdプロパティを設定
obj.objectId = "***検索するデータのobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj.fetchInBackground{  obj2 , e ->
    if (e != null) {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        if( obj2 is NCMBObject){
            obj2.addUniqueToList("array", listOf("A","D","F"))
            obj2.saveInBackground { e2 ->
                if (e2 != null) {
                    // 保存に失敗した場合の処理
                } else {
                    // 保存に成功した場合の処理
                }
            }
        }
    }
}
```

* フィールドの値を["A", "B", "C"]と保存しているデータであれば、上のサンプルでは["A", "D", "F"]を追加するので、["A", "B", "C", "D", "F"]に更新されます。

##**オブジェクトの削除**
* 非同期で削除する場合は、deleteObjectInBackgroundメソッドを利用します。
* 以下はオブジェクトの取得、更新と同様にobjectIdを指定して、削除を行うサンプルです。

```kotlin:Kotlin
// クラスのNCMBObjectを作成
var obj = NCMBObject("TestClass")
// objectIdプロパティを設定
obj.objectId = "***検索するデータのobjectId***"
// 設定されたobjectIdを元にデータストアからデータを取得
obj.fetchInBackground{  obj2 , e ->
    if (e != null) {
        // 取得に失敗した場合の処理
    }else{
        // 取得に成功した場合の処理
        if( obj2 is NCMBObject){
            obj2.deleteObjectInBackground { e2 ->
                if (e2 != null) {
                    // 保存に失敗した場合の処理
                } else {
                    // 保存に成功した場合の処理
                }
            }
        }
    }
}
```

##**参考**
* 元サイト
 * [データストア \(Android\) : 基本的な使い方 \| ニフクラ mobile backend](http://mbaas.nifcloud.com/doc/current/datastore/basic_usage_android.html)