Parse Server Java SDKの使い方（Kotlinでのファイルアップロード・ダウンロード）

[ニフクラ mobile backendは3月末で終了します](https://mbaas.nifcloud.com/info/2023/12/post-171.html)。

ニフクラ mobile backendからの移行先として、お勧めしているのが[Parse Server](https://parseplatform.org/)です。設計思想が近く、変更するコード量が少なく済むのではないかと思います。

Parse ServerではAndroid向けにSDKを提供していますが、言語はJavaのみとなっています。Kotlin向けには、Java SDKの内容を翻訳しながら実装する必要があります。そこで、各機能の使い方を解説します。今回はデータストアオブジェクトの使い方です。

## Android SDKのインストール

Android SDKのインストールは幾つかの設定が必要です。

### settings.gradleの修正

プロジェクトルートにある `settings.gradle` を修正します。

```groovy
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
				// 以下を追加
        maven {
            url "https://jitpack.io"
        }
    }
}
```

### app/build.gradleの修正

app以下にある `build.gradle` を修正します。

```groovy
dependencies {
	// 以下を追加
	implementation "com.github.parse-community.Parse-SDK-Android:parse:4.2.1"
}
```

バージョンはインストールするタイミングによって異なりますが、現在は以下です。

![](https://jitpack.io/v/parse-community/Parse-SDK-Android.svg)

### AndroidManifest.xmlの修正

開発中で、ローカルのParse Serverを使う場合には、以下の設定が必要です。

```xml
<application
	android:usesCleartextTraffic="true" <!-- 追加 -->
>
```

## 初期化

SDKの初期化は `MainActivity` にて行います。Androidはエミュレーターなので、 `localhost:1337` ではなく、 `192.168.0.2:1337` などがParse ServerのURLになるでしょう。

```kotlin
import com.parse.Parse

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Parse.initialize(
            Parse.Configuration.Builder(this)
                .applicationId("appId")
                .clientKey("clientKey")
                .server("http://your_parse_server/parse/")
                .build()
        )
				// 省略
		}
}
```

## 注意点

### ローカルデータストアとの相性が悪いです

初期化時に `.enableLocalDataStore()` を追加すると、ファイルがローカルに保存され、それをParseObjectに紐付けて保存すると `Unable to encode an unsaved ParseFile` というエラーが発生します。

### Parse Serverにはファイルストアはありません

Parse ServerにはNCMBでいうファイルストア相当の機能はありません。ファイルはデータストアの1フィールドに紐付けて保存します。また、取得できるのはURLのみで、実データの取得はURLからダウンロードする形になります。

## データの保存

ファイルデータは以下のコードで保存できます。ただし、ファイルストア的な機能はないので、データストアの1フィールドに紐付けて保存します。

```kotlin
val data = "これはテストファイルです".toByteArray()
val file = ParseFile("test.txt", data)
file.save()
val job = ParseObject("Job")
job.put("name", "Joe Smith")
job.put("file", file)
job.save()
Log.d("DEBUG", "Saved. id -> " + jobApplication.objectId)
```

## データの取得

ファイルの内容を取得する際には `getDataInBackground` を使います。

```kotlin
job.getParseFile("file")?.getDataInBackground(GetDataCallback { data, e ->
		if (e == null) {
				Log.d("DEBUG", String(data, Charsets.UTF_8))
		} else {
				Log.d("DEBUG", e.message ?: "")
		}
})
```

同期処理の場合は、 `data` でアクセスできます。 `data` はByteArrayです。

```kotlin
String(j.getParseFile("file")?.data ?: ByteArray(0), Charsets.UTF_8)
```

## まとめ

Parse Serverにはファイルストア相当の機能がないため、NCMBとは実装内容が大きく異なります。また、ローカルデータストアとの相性が悪いため、注意が必要です。

とはいえ、データの管理方法などはParse ServerとNCMBで似ています。他のmBaaSと比べると、全体の修正量はそこまで多くないと思われます。載せ替え先として検討に挙げてください。

[Android Developers Guide \| Parse](https://docs.parseplatform.org/android/guide/)