aclにはパーミッションを設定する
さて、説明を飛ばした(2)以降のコードはaclフィールドについての処理です。aclフィールドにはパーミッションを設定します。パーミッションを設定するにはNCMBACLクラスを使います。NCMBACLクラスのコンストラクタでtaskACLオブジェクトを生成します(2)。taskACLオブジェクトを使って、パーミッションを設定していくわけですが、どんな風に設定したいかを先に説明しましょう。
このアプリでは、タスク(仕事の名前)は誰でも作成できるようにします。そして、そのタスクに関係するメンバーはタスクを選んで、開始時間、終了時間を記録できるようにします。タスクに参加するメンバーはあらかじめ限定せず、誰でも参加できるようにしたいと思います。ですから、TaskClassのレコードは誰でも読み込むことができるようにしないといけません。
しかし、タスクの名前を変更したり、このタスクはもう終わったので削除するといった更新権は、タスクを作成した人だけに与えたいと思います。それが、(3)以降のコードです。setPublicReadAccessメソッドの引数にtrueを指定してパブリックに読込権限を与えます。WriteAccess(更新権限)はNCMBUserクラスのgetCurrentUser()メソッドで、現在のユーザーを取得してsetWriteAccessメソッドで与えます。
task.setACL(taskACL)でレコードにセットします。
aclフィールドの青い「パーミッション編集」ボタンを押すとパーミッションの設定が表示されます。全員が読み込み可能で、特定の会員が更新・削除可能であることがわかります。
Androidのアプリ開発でよくやるミスなのですが、Activity追加した場合は、忘れずにマニフェストファイルAndroidManifest.xmlにもActivityを追加してやりましょう。この場合だと、マニフェストにリスト4の(1)のようにActivityを追加します。そうしないと、Activityを呼び出したときにエラーになってしまいます。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.co.easier.stamptime" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoginActivity"> </activity> <activity android:name=".UserAddActivity"> </activity> <activity (1) android:name=".TaskAddActivity"> </activity> </application> </manifest>
最後に
今回はデータストアの基本について解説しました。クラスを管理画面から作成済のときでも、作成していないときでも同じコードでレコードを登録できるので便利ですね。
また、aclでは、会員単位ではなくロール(共通の役割を持つグループ)を作成してロール単位でレコードやクラスに権限を与えることもできます。
次回はもう少し高度なデータストアの使い方を説明します。