はじめての Monaca と mobile backend ～DBの使い方練習～

# はじめに
はじめて Monaca で ニフクラ mobile backend を使ってみるという方向けの練習コンテンツです。手順に沿って取り組むだけで、mobile backend のDB機能の「保存」と「取得」の実装ができるようになります。

# 事前に必要な準備
* [Monacaのアカウント取得](https://monaca.mobi/ja/signup)（無料）
  * 無料トライアルで「Freeプラン」を選択して登録してください。
* [ニフクラ mobile backend のアカウント取得]()（無料）
  * Google アカウントを利用すると便利です。Googleアカウント取得（無料）は[こちら](https://accounts.google.com/signup)。

# 1. Monacaの使い方練習

# プロジェクトを作る

Monacaにログインして、「新しいプロジェクトを作る」から「最小限のテンプレート」を選んでプロジェクトを作成します。

# 画面表示の仕組みを知る

作成したプロジェクトを開きますす。
画面中央に `index.html` 、右にプレビュー画面が表示されています。
`index.html` を編集してアプリを作ります。作ったアプリはプレビュー画面に反映されるので確認しながら作ることができます。
（他、左にディレクトリ、下にデバッガー利用時のログが表示される個所があります。今回は触りません。）

デフォルトの `index.html` はこんな感じ。

```html:index.html
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta http-equiv="Content-Security-Policy" content="default-src * data: gap: content: https://ssl.gstatic.com; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
    <script src="components/loader.js"></script>
    <link rel="stylesheet" href="components/loader.css">
    <link rel="stylesheet" href="css/style.css">
    <script>
    </script>
</head>
<body>
	<br />
    This is a template for Monaca app.
</body>
</html>
```

デフォルトのプレビュー画面を見てみると、`This is a template for Monaca app.` と表示されています。これは `index.html` の `body` タグ内と同じことがわかりますね。

```html:index.html
<body>
	<br />
    This is a template for Monaca app.
</body>
```

つまり、 `body` タグ内に記述した内容がアプリに表示されるというわけです。
試しに `body` タグ内をすべて消してみましょう。

```html:index.html
<body>

</body>
```

プレビュー画面に反映させるには `index.html` を保存する必要があります。保存するには以下のいづれかを実施してください。

* Monaca上部のタブ「設定」＞「保存」をクリックする
* Windowsの場合：「Ctrl」+「s」キーを押す
* Macの場合：「Command」+「s」キーを押す

正しく保存できると、プレビュー画面が真っ白になります。

# 入力フィールドとボタンを作る

`body` タグ内に入力フィールドとボタンを作ってみましょう。

```html:index.html
<body>
<textarea>テキストエリア</textarea>
<button>ボタン</button>
</body>
```

保存するとプレビュー画面は次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/938a1340-3906-0157-4e93-19dc2ab3db4c.png)

ボタンを押したらテキストフィールドに入力した内容がアラートで表示されるようにしてみましょう。
テキストエリアにID、ボタンにクリックイベントを追加しましょう。

```html:index.html
<body>
<textarea id="message">テキストエリア</textarea>
<button onclick="pushButton();">ボタン</button>
</body>
```

ボタンを押したときの処理を `pushButton()` という関数を作って書いていきます。関数は `body`タグではなく、`script`タグに書きます。`script`タグは`body`タグの少し上にあります。

```html:index.html
<script>
</script>
```

関数 `pushButton()` を作ります。（関数はJavaScriptで書きます。）

```html:index.html
<script>
// ボタンが押されたときの処理
function pushButton() {

}
</script>
```

テキストエリアに書かれた内容を取得して、アラートで表示するコードを書いてみます。

```html:index.html
<script>
// ボタンが押されたときの処理
function pushButton() {
// テキストエリアの値を取得する
var message = document.getElementById("message").value;
// アラートで表示する
alert(message);
}
</script>
```

ここまで書くと全体はこんな感じ。

```html:index.html
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta http-equiv="Content-Security-Policy" content="default-src * data: gap: content: https://ssl.gstatic.com; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
    <script src="components/loader.js"></script>
    <link rel="stylesheet" href="components/loader.css">
    <link rel="stylesheet" href="css/style.css">
    <script>
      // ボタンが押されたときの処理
      function pushButton() {
      // テキストエリアの値を取得する
      var message = document.getElementById("message").value;
      // アラートで表示する
      alert(message);
      }
    </script>
</head>
<body>
	<textarea id="message">テキストエリア</textarea>
  <button onclick="pushButton();">ボタン</button>
</body>
</html>
```

保存をして、プレビュー画面で動作確認をしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/a52de8ab-c4d3-e049-f093-8a72ed9141e3.png)

# 2. mobile backend に保存してみる

今度はボタンを押したら、テキストエリアに書いた内容が mobile backend （クラウド）保存されるようにしてみましょう。ボタンを押した後の処理だけを書き換えるので、`script`内を編集します。

```html:index.html
<script>
// ボタンが押されたときの処理
function pushButton() {
// テキストエリアの値を取得する
var message = document.getElementById("message").value;
// アラートで表示する
alert(message);
}
</script>
```

ここで mobile backend を使うための準備をします。

## 2.1. mobile backend のSDKを Monaca に導入する

Monaca上部のタブ「設定」＞「JS/CSSコンポーネントの追加と削除」を開きます。コンポーネント名として「ncmb」で検索して、追加します。バージョンはデフォルトのまま（最新）で、読み込むファイルに必ずチェックを入れて保存してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/7aa4e5bd-4420-05f8-55f7-b8a8c04b777c.png)

一覧に追加されていればOKです。

## 2.2. mobile backend でアプリを作成

mobile backend にログインをして管理画面を開きます。管理画面から、アプリを１つ作ります。（アプリ名はなんでもOKです）アプリを作成すると、 **APIキー（アプリケーションキーとクライアントキー）** が発行されます。

## 2.3. mobile backend を使うために最初にやること

まず、２つのAPIキーを `script`タグ内に記入していきます。

```html:index.html
<script>
// APIキー
var applicationKey = "******";
var clientKey = "******";

// ボタンが押されたときの処理
function pushButton() {
// テキストエリアの値を取得する
var message = document.getElementById("message").value;
// アラートで表示する
alert(message);
}
</script>
```

`******` の部分に mobile backend の管理画面からコピーした アプリケーションキーとクライアントキーを、それぞれ貼り付けます。

* APIキーの確認方法
  * 管理画面右上の「アプリ設定」の中にあります。

次に、入力したAPIキーで１つ前に導入したSDKを初期化します。APIキーに続け次のように書きます。

```html:index.html
<script>
// APIキー
var applicationKey = "******";
var clientKey = "******";
// SDKの初期化
var ncmb = new NCMB(applicationKey, clientKey);

// ボタンが押されたときの処理
function pushButton() {
// テキストエリアの値を取得する
var message = document.getElementById("message").value;
// アラートで表示する
alert(message);
}
</script>
```

これで mobile backend が使える状態になりました。

## 2.4. mobile backend にデータを保存する

いよいよボタンを押したらテキストエリアに入力した値を mobile backend に保存するコードを書いてみましょう。
`alert` の下に続けて書きます。

```html:index.html
<script>
// APIキー
var applicationKey = "******";
var clientKey = "******";
// SDKの初期化
var ncmb = new NCMB(applicationKey, clientKey);

// ボタンが押されたときの処理
function pushButton() {
// テキストエリアの値を取得する
var message = document.getElementById("message").value;
// アラートで表示する
alert(message);

/** mobile backend に保存する **/
// 保存先クラスの生成
var MessageClass = ncmb.DataStore("MessageClass");
// クラスインスタンスの生成
var messageClass = new MessageClass();
// データを設定して保存する
messageClass.set("message", message).save();
}
</script>
```

保存をして、プレビュー画面で動作確認をしてみましょう。mobile backend の管理画面を開いてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/45484d4d-47b5-7c9e-2043-b2ff1eb85cea.png)

「データストア」に「MessageClass」ができて、その中に入力した内容が保存されたことが確認できます。
何回か記入内容を変えてボタンを押してみましょう。管理画面は左上の「更新」ボタンを押すと最新の状態を確認できます。

# 3. mobile backend の管理画面からデータを保存してみる

おみくじアプリを作ってみましょう。まずは、おみくじデータをmobile backend 上に用意してみます。
mobile backend の管理画面からデータストアを開きます。

「＋作成▼」＞「新規作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/86b7c29d-9010-accc-8aa8-c6b8608d0f8d.png)

クラス名を「`Omikuji`」にしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/de635d31-1ad2-25b3-1424-1181ed8d3fe9.png)

クラスが作成されたらデータを作っていきます。

上部にある「＋新しいフィールド」をクリックします。フィールド名を「`result`」（おみくじを引いたときの”結果”の意味）にしましょう。

フィールドができたらデータを入れるレコードを作ります。「＋新しいレコード」をクリックすると次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/f646d529-b584-4bfd-d30c-67baf60a303c.png)

`result`に値を入れてみます。まずは「大吉」を入れましょう。ダブルクリックすると入力できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/65d1b9e3-3cbd-194b-d4dc-e8fd877bc43a.png)

「大吉」と書いて「Enter」キーを押すとデータが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/e9752b64-5839-9a87-52fc-da62ba9ac143.png)

同様にしてフィールドを追加し、「中吉」「小吉」「吉」「凶」「大凶」などなど入れてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/52b12547-525c-34aa-c527-ba2a4b8e35b8.png)


# 4. mobile backend からデータを取得してみる

保存したおみくじデータを使っておみくじアプリを作ってみましょう。
まずはボタンと結果を表示するための場所を用意します。
次のコードを `body`タグの最後に追加します。

```
</br>
<button onclick="omikuji();">おみくじを引く</button>
結果：<span id="result"></span>
```

こんな感じです。

```html:index.html
<body>
<textarea id="message">テキストエリア</textarea>
<button onclick="pushButton();">ボタン</button>
</br>
<button onclick="omikuji();">おみくじを引く</button>
結果：<span id="result"></span>
</body>
```

保存するとプレビュー画面はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/c66f1388-9624-8b26-a2bd-b7d45ca44a3a.png)

おみくじボタンを押すと、ボタンの横に結果を表示することが最終目的ですが、まずはボタンを押したらボタンの横に何か文字が表示されるようにしてみましょう。

`script`タグの一番下に `omikuji()` 関数を書きます。

```html:index.html
<script>
// APIキー
var applicationKey = "******";
var clientKey = "******";
// SDKの初期化
var ncmb = new NCMB(applicationKey, clientKey);

// ボタンが押されたときの処理
function pushButton() {
/** 省略 **/
}

// おみくじボタンが押されたときの処理
function omikuji() {
        
}
</script>
```

`omikuji()` 関数内に次のように書きます。

```js
// おみくじボタンが押されたときの処理
function omikuji() {
// 結果（テスト）
var result = "テストです";
// 画面に結果を表示
document.getElementById("result").innerText = result;     
}
```

保存をして、プレビュー画面で動作確認をしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/07a191fd-1758-1bf1-e5e7-ea5ae560a4e9.png)

ボタンを押すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/c20d5e4d-ca2a-ccc9-ac27-6130917aa210.png)

「テストです」と表示されればOKです。
では、いよいよ mobile backend からデータを取得して表示するようにしてみましょう。

取得は次のようなコードで行います。`fetchAll` で全件取得することができ、取得に成功した場合は `objects` にデータが入ります。（データは１つ１つがオブジェクト型で、全件取得の場合は配列として取得されます。）
取得したデータの処理は★に書きます。


```js
/** mobile backend に取得する **/
// 保存先クラスの生成
var Omikuji = ncmb.DataStore("Omikuji");
// 取得処理
Omikuji.fetchAll()
       .then(function(objects){
           /* 取得成功時の処理 */
           // ★
       })
       .catch(function(error){
           /* 取得失敗時の処理 */
           alert("Error: " + error.code);
       });
```

今回はおみくじなので、複数ある結果のデータの中からランダムで１件だけ選び表示したいので、次のように★のところの処理を書きます。

```js
/** mobile backend に取得する **/
// 保存先クラスの生成
var Omikuji = ncmb.DataStore("Omikuji");
// 取得処理
Omikuji.fetchAll()
       .then(function(objects){
          /* 取得成功時の処理 */
          // データ数内で乱数を作成
          var random = Math.floor(Math.random()*objects.length);
          // 乱数番目のデータ
          var object = objects[random];
          // 「result」フィールドの値を取得
          var result= object.get("result");
          // 画面に結果を表示
          document.getElementById("result").innerText = result;
       })
       .catch(function(error){
          /* 取得失敗時の処理 */
          alert("Error: " + error.code);
       });
```

先ほどテストで書いた以下のコードを削除して、一度 `omikuji()` 関数を空にしてから、↑の内容を書いていきます。

```js
// 結果（テスト）
var result = "テストです";
// 画面に結果を表示
document.getElementById("result").innerText = result;
```


そうすると次のようになります。



```html:index.html
<script>
  // APIキー
  var applicationKey = "******";
  var clientKey = "******";
  // SDKの初期化
  var ncmb = new NCMB(applicationKey, clientKey);

  // ボタンが押されたときの処理
  function pushButton() {
  // テキストエリアの値を取得する
    var message = document.getElementById("message").value;
    // アラートで表示する
    alert(message);

    /** mobile backend に保存する **/
    // 保存先クラスの生成
    var MessageClass = ncmb.DataStore("MessageClass");
    // クラスインスタンスの生成
    var messageClass = new MessageClass();
    // データを設定して保存する
    messageClass.set("message", message).save();
  }

  // おみくじボタンが押されたときの処理
  function omikuji() {
    /** mobile backend に取得する **/
    // 保存先クラスの生成
    var Omikuji = ncmb.DataStore("Omikuji");
    // 取得処理
    Omikuji.fetchAll()
           .then(function(objects){
             /* 取得成功時の処理 */
             // データ数内で乱数を作成
             var random = Math.floor(Math.random()*objects.length);
             // 乱数番目のデータ
             var object = objects[random];
             // 「result」フィールドの値を取得
             var result= object.get("result");
             // 画面に結果を表示
             document.getElementById("result").innerText = result;
          })
          .catch(function(error){
             /* 取得失敗時の処理 */
             alert("Error: " + error.code);
          });
  }
</script>
```

保存をしたらプレビュー画面で動作確認をしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/0a84432e-971c-6bfd-5dcb-37d8baa9fe24.png)

mobile backend 側のデータを変える（追加、変更、削除）とおみくじの結果も変わるのでぜひ試してみましょう！