LoginSignup
0
0

More than 1 year has passed since last update.

NCMB Kotlin SDKを使って日報アプリを作る(その3 データの取得と一覧表示)

Posted at

NCMBでは公式SDKとしてSwift/Objective-C/Kotlin/Java/Unity/JavaScript SDKを用意しています。また、それ以外にもコミュニティSDKとして、非公式ながらFlutter/React Native/Google Apps Script/C#/Ruby/Python/PHPなど幅広い言語向けにSDKが開発されています。

今回は公式SDKの一つ、Kotlin SDKを使って日報アプリを作ってみます。前回はログインとデータの保存について解説しましたので、今回は保存したデータの取得と一覧表示について解説します。

完成版のコード

作成したデモアプリのコードはNCMBMania/Kotlin_DailyReportにアップロードしてあります。

日報データの取得

日報データの表示は ListScreen にて行います。日報データは ary に入る形になります。入ったデータは LazyColumn を使って一覧表示します。

@Composable
fun ListScreen(navController: NavController) {
    var ary = remember { mutableStateOf<List<NCMBObject>>(emptyList()) }
		// データの取得(後述)
		// 画面構築
    Scaffold(
        topBar = {
                TopAppBar(
                    title = {
                        Text("日報一覧")
                    },
                    actions = {
                        IconButton(
                            onClick = {
                                navController.navigate("form")
                            }
                        ){
                            Icon(Icons.Filled.Add, contentDescription = "日報の作成")
                        }
                    }
                )
        },
        content = {
            Column {
                LazyColumn(
                ) {
                    items(ary.value) { obj ->
                        ListRow(obj, navController = navController)
                    }
                }
            }
        }
    )
}

Screenshot_20220414_172126.png

データの取得

データを取得する際には NCMBQuery を使います。今回は条件を指定していませんが、文字列の検索や以上以下などの条件が使えます。検索結果はAny型なので、 List<NCMBObject> にキャストします。

val query = NCMBQuery.forObject("DailyReport")
query.findInBackground(NCMBCallback { e, results ->
		if (e == null) {
				ary.value = results as List<NCMBObject>
		}
})

表示

データの表示を行っているのは ListRow になります。ここでは一覧画面から受け取ったNCMBObjectを表示しています。文字列の場合は getString(key) で取得できますが、Nullableなので注意してください。

@Composable
fun ListRow(obj: NCMBObject, navController: NavController) {
		// 詳細画面への遷移
    val moveDetail = {
				// 後述
    }
		// 画面構築
    Row(
        verticalAlignment = Alignment.CenterVertically,
        modifier = Modifier
            .fillMaxWidth()
            .padding(10.dp)
            .background(Color.White, RoundedCornerShape(5.dp))
            .clickable {
                moveDetail()
            }
    ) {
        Text(obj.getString("title")!!, fontSize = 25.sp)
    }
}

詳細画面への遷移

詳細画面に遷移する際には、対象データを文字列として渡す必要があります。そこでJSONObjectを使ってデータを文字列に変換しています。

val moveDetail = {
		val json = JSONObject()
		obj.keys.forEach {key ->
				json.put(key, obj.get(key)!!)
		}
		navController.navigate("detail/obj=${json.toString()}")
}

このデータをNCMBObjectとして復元する処理についてはKotlinのNavigation コンポーネントを使ってNCMBObjectを別画面に渡す - QiitaのstrToNCMBObjectを参照してください。

日報詳細表示について

日報の詳細表示は、ナビゲーションで復元したNCMBObjectを受け取ります。

composable(
		route = "detail/obj={obj}",
		arguments = listOf(navArgument("obj") { type = NavType.StringType })
) { backStackEntry ->
		val obj = strToNCMBObject(backStackEntry.arguments!!.getString("obj")!!, "DailyReport")
		DetailScreen(navController, obj)
}

DetailScreenは単純にデータを表示しているだけです。こちらでもまた、 getString でテキストを表示していますが、Nullableなので注意してください。編集画面に移動する際には、またデータを文字列に変換して渡しています。

@Composable
fun DetailScreen(navController: NavController, obj: NCMBObject) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = {
                    Text("日報")
                },
                actions = {
                    IconButton(
                        onClick = {
                            val json = JSONObject()
                            obj.keys.forEach {key ->
                                json.put(key, obj.get(key)!!)
                            }
                            navController.navigate("edit/obj=${json.toString()}")
                        }
                    ){
                        Icon(Icons.Filled.Edit, contentDescription = "Edit")
                    }
                }
            )
        },
        content = {
            Column {
                Text(text = obj.getString("title")!!,
                    fontSize = 35.sp,
                    modifier = Modifier.padding(5.dp)
                )
                Text(text = obj.getString("body")!!,
                    fontSize = 30.sp,
                    modifier = Modifier.padding(5.dp)
                )
            }
        }
    )
}

Screenshot_20220414_172234.png

まとめ

今回の日報アプリでは認証、データ保存、データ取得を実装しました。いずれもアプリ開発ではよく使う機能なので、ぜひ使い方を覚えてあなたのアプリ開発に役立ててください。

mBaaSでサーバー開発不要! | ニフクラ mobile backend

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0