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では、会員単位ではなくロール(共通の役割を持つグループ)を作成してロール単位でレコードやクラスに権限を与えることもできます。
次回はもう少し高度なデータストアの使い方を説明します。

