本記事はKii Cloud JavaScript SDKを使ってアカウント登録とログイン機能を実装するの続編です。今回は、データをKii Cloud上に保存する方法についてご紹介します。※ユーザーがログインしていることを前提としています。
オブジェクトのスコープを決める
ファイルのアップロード含め、ユーザー以外のデータはすべてKiiObjectを使って操作します。また、Kii Cloud上へのデータ保存には、必ずBucket(以降、バケツと呼びます)が必要です。例えばTODOアプリで自分だけのTODO、グループに共有したいTODO、全体に公開したいTODOの機能を実装する場合、それぞれユーザースコープのバケツ、グループスコープのバケツ、アプリケーションスコープのバケツにオブジェクトを保存します(※準備編でも例に挙げています)。
どのスコープのバケツも、最初は新規作成する必要があります。以下はそれぞれのスコープのオブジェクトを作成するステップです。
■アプリケーションスコープのオブジェクトの場合
ログインしているすべてのユーザーが閲覧可能なオブジェクトは、アプリケーションスコープのバケツに作成します。
- アプリケーションスコープのバケツを作る
- オブジェクトを作る
- オブジェクトをKii Cloudに保存する
■グループスコープのオブジェクトの場合
ある特定のユーザーの集まりにのみ閲覧可能なオブジェクトは、グループスコープのバケツに作成します。グループスコープのバケツを作る際にグループを指定しなければならないので、グループの作成も必要です。グループ作成時のグループメンバーは作成者本人しか居ないので、メンバーは後から追加します。
- グループを作る(すでにグループがある場合はグループを取得する)
- グループスコープのバケツを作る
- オブジェクトを作る
- オブジェクトをKii Cloudに保存する
■ユーザースコープのオブジェクトの場合
自分自身にのみ閲覧可能なオブジェクトは、ユーザースコープのバケツに作成します。
- ユーザースコープのバケツを作る
- オブジェクトを作る
- オブジェクトをkiiCloudに保存する
オブジェクトを新規作成する
ここでは一番ステップの多いグループスコープのオブジェクトに焦点を当てて実装例をご紹介します。まず、グループを作成します。グループ名が同じであっても、新規にグループを作成してしまうと、Kii Cloud上に同じ名前のグループがいくつも作成されてしまう(名前が同じでURIが異なるグループができる)ので注意してください。バケツは名前が同じでも複数作られることはありません。
var groupName = "riaxdnp"; function groupWithName(name) { // グループを作成する var group = KiiGroup.groupWithName(name); // グループを保存する return kiiPromise(group.save, group); } // 何度も実行すると、同じ名前のグループがたくさんできてしまうので注意。groupWithName(groupName). then(showSuccess, showError); |
すでにグループがある場合は、ユーザーがメンバーとして属しているグループの一覧を取得しておき、グループURIからグループオブジェクトを再インスタンス化します。以下の画像のTODOアプリのサンプルでは、ユーザーがログインした際にグループ一覧を取得し、リスト要素の属性にURIを持たせています。TODO作成時に、選択したリストの属性からURIを取得し、再インスタンス化します。
// メンバーとして属しているグループの一覧を取得する function memberOfGroups() { // ログイン中のユーザーを取得する var user = KiiUser.getCurrentUser(); return kiiPromise(user.memberOfGroups, user); } function showGroupLists(theUser, memberOfGroups) { // memberOfGroupsを表示する // group.objectURI() でURIを取得し属性に設定しておく} memberOfGroups(). then(showGroupLists, showError); |
グループの用意が出来たら、そのグループオブジェクトからグループスコープのバケツを作成します。そして、バケツからオブジェクトを作成し、TODOに必要データをsetしたあと、Kii Cloudと同期します。
var $form = $("#todoform"); var todotext = $form.find(".todotext").val(); var scope = $form. find("input:radio[name = 'group-type']:checked"). val();var groupUri = $form. find("[data-group-uri]"). data("groupUri"); var vals = { todo : todotext }; var bucket = getBucket(scope, "riaxdnp", groupUri); createObject(bucket, vals). then(showSuccess, showError); // スコープに応じたbucketを返す function getBucket(scope, bucketName, groupUri){ var bucket = {}; switch(scope) { case "app":bucket = Kii.bucketWithName(bucketName); break;case "group": // URIから再インスタンス化する var group = new KiiGroup.groupWithURI(uri); bucket = group.bucketWithName(bucketName); break; case "user": var user = KiiUser.getCurrentUser(); bucket = user.bucketWithName(bucketName);break; } return bucket; } // オブジェクトを作成する function createObject(bucket, vals) { var obj = bucket.createObject(); for(var key in vals) {if(vals.hasOwnProperty(key)){obj.s (key, vals[key]);} } return kiiPromise(obj.save, obj); } |
オブジェクトの作成が成功すると、データブラウザーのObjectsに新規作成したオブジェクトが追加されます。
バケツ内のオブジェクトを取得する
オブジェクトの取得にもバケツを使います。バケツ内のすべてのオブジェクトを取得する場合も、特定の条件を満たすオブジェクトを取得する場合も、KiiQueryを使って検索を行います。
// バケツ内のオブジェクトを指定件数分だけ取得する検索Queryを作る function buildAllObjectQuery(bucket, limit) { var d = $.Deferred(), query = KiiQuery.queryWithClause(); if(limit){query.setLimit(limit); } // 更新日時降順query.sortByDesc("_modified"); return d.resolve(bucket, query); } // 検索を実行するfunction executeQuery(bucket, query) { return kiiPromise(function (callbacks) { bucket.executeQuery (query,callbacks);}); } buildAllObjectQuery(bucket). then(executeQuery). then(function(queryPerformed, resultSet, nextQuery) { // resultSetを表示する}, showError); |
ユーザーが作成したすべてのTODOを取得するには、それぞれのスコープのバケツに対して検索を実行します。
まとめ
今回はオブジェクトの新規作成と取得の方法をご紹介しました。オブジェクトの操作には、KiiObjectとKiiBucketが必要(グループスコープの場合はKiiGroupも)ということがお分かりいただけたかと思います。