ついに登場したNCMBのKotlin SDKを試す！

NCMB（ニフクラ mobile backend）では多数のプラットフォームに対してSDKを提供しています。公式のものとしてはObjective-C、Swift、Java、Unity、JavaScriptなどがあります。コミュニティベースではReact Native、Flutter、Google Apps Script、VBA、Ruby、PHP、C#(Xamarin)などもあります。

そしてまだデベロッパープレビューながら、新しいSDKとしてKotlin SDKが登場しました。今回はさくっとデータストアの保存までを試してみました。

## Androidプロジェクトの作成

Android Studioでプロジェクトを作成します。Androidは8.0以降を選択してください。

## SDKのダウンロード

SDKは[GitHubのリリース](https://github.com/NIFCLOUD-mbaas/ncmb_kotlin/releases)にて公開されています。基本的に最新のものを選んでください。ダウンロードして解凍するとNCMB.jarというファイルがあるので、それをAndroidプロジェクトの app/libs/ 以下に保存します。

## build.gradleの修正

`app/build.gradle` を開いてライブラリを追加します。同期処理用のライブラリもありますが、アプリの場合にはネットワーク処理は非同期が基本なので通常は不要かと思います。

```
// 省略
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.1'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

    // 追加 
    implementation 'com.squareup.okhttp3:okhttp:4.8.1'
    implementation 'com.google.code.gson:gson:2.3.1'
    api files('libs/NCMB.jar')

    // 同期処理を使用する場合はこちらを追加
    // implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9'
}
```

## AndroidManifest.xmlの修正

AndroidManifest.xmlを開いて、applicationタグの上で uses-permission を追加します。

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nifcloud.mbaas.ncmbhello">
    <!-- この2行を追加 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```

## 必要なライブラリの読み込み

今回はMainActivity.ktにてライブラリを読み込みます。

```kotlin
import com.nifcloud.mbaas.core.NCMB
import com.nifcloud.mbaas.core.NCMBCallback
import com.nifcloud.mbaas.core.NCMBObject
```

## NCMB SDKの初期化

続いて onCreate でSDKを初期化します。

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    NCMB.initialize(
        this.getApplicationContext(),
        "YOUR_APPLICATION_KEY",
        "YOUR_CLIENT_KEY"
    );
```

## データの保存を試す

今回は画面上に適当なボタンを配置して、それをタップしたタイミングでデータストアへの保存を行ってみます。まずボタンを読み込みます。

```kotlin
val btnSave: Button = findViewById(R.id.btnSave)
```

処理がうまくいった際にトーストを出すので、メインストレッドで準備しておきます。非同期処理内でトーストを作ると、エラーになるので注意してください。

```kotlin
val toast = Toast(this)
toast.duration = Toast.LENGTH_SHORT
```

ボタンをタップした際のイベント処理を用意します。

```kotlin
btnSave.setOnClickListener {
  // この中に書きます
}
```

まずデータストアに保存するためのNCMBObjectを用意します。データベースでのテーブル名に相当するクラス名を、Helloとします。

```kotlin
val obj = NCMBObject("Hello")
```

フィールド（データベースでいうフィールド相当）を用意します。今回はmsgというフィールドにHelo, worldという文字列をセットします。

```kotlin
obj.put("msg", "Hello, world")
```

保存処理を実行します。別スレッドで処理され、コールバックが呼ばれます。

```kotlin
obj.saveInBackground(NCMBCallback { e, _ ->
  // この中に書きます
})
```

エラーの有無を判定して、トーストでメッセージを出します。

```kotlin
if (e != null) {
    // エラー
    toast.setText("エラーが発生しました")
} else {
    toast.setText("保存しました。オブジェクトID: ${obj.getObjectId()}")
}
toast.show()
```

全体の処理は次のようになります。

```kotlin
package com.nifcloud.mbaas.ncmbhello

import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.nifcloud.mbaas.core.NCMB
import com.nifcloud.mbaas.core.NCMBCallback
import com.nifcloud.mbaas.core.NCMBObject

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        NCMB.initialize(
            this.getApplicationContext(),
            "YOUR_APPLICATION_KEY",
            "YOUR_CLIENT_KEY"
        );
        val toast = Toast(this)
        toast.duration = Toast.LENGTH_SHORT
        setContentView(R.layout.activity_main)
        val btnSave: Button = findViewById(R.id.btnSave)
        btnSave.setOnClickListener {
            val obj = NCMBObject("Hello")
            obj.put("msg", "Hello, world")
            obj.saveInBackground(NCMBCallback { e, _ ->
                if (e != null) {
                    // エラー
                    toast.setText("エラーが発生しました")
                } else {
                    toast.setText("保存しました。オブジェクトID: ${obj.getObjectId()}")
                }
                toast.show()
            })

        }
    }
}
```

## まとめ

これまではKotlinの中でJava SDKを使っていましたが、KotlinネイティブのSDKが出たことによって、書き方もKotlinらしく書けるようになっています。デバッグもしやすくなると思われます。ぜひ使ってみてください。

[NIFCLOUD-mbaas/ncmb_kotlin: NIFCLOUD mobile backendのKotlin SDK](https://github.com/NIFCLOUD-mbaas/ncmb_kotlin)