monacaでクイズアプリ(1)

前回は、以下の写経もどきをしてみたが、クイズ作成までは至らなかった。

ニフティクラウドmobile backendを試してみる(5)クイズアプリその2
monacaについて知りたくて、以下の本を購入した。 こちらを参考に、以下を写経してみたい。 Monacaを使ってクイズアプリをたった1時...

今回は、以下の本の、Chapter7を写経する。最終的には、できれば、データベースは、niftymobilebacendを使いたい。

(0)WEBブラウザに用意されているデータベース、Web SQLデータベースと、IndexedDB

そんなものがあるなんて知らなかった。とりあえず、IndexedDB(iPhoneでは微妙らしい。)

最終的には、データベースは、NCMBを使いたい。

(1)monacaアプリの新規作成

image

image

(2)Onsen UI を試してみる
(掌田津耶乃 つくりながら覚えるスマホゲームプログラミング Chapter 4)

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:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
  <script src="components/loader.js"></script>
  <script src="lib/onsenui/js/onsenui.min.js"></script>

  <link rel="stylesheet" href="components/loader.css">
  <link rel="stylesheet" href="lib/onsenui/css/onsenui.css">
  <link rel="stylesheet" href="lib/onsenui/css/onsen-css-components.css">
  <link rel="stylesheet" href="css/style.css">
  
  <script src="main.js"></script>
</head>

<body style="margin: 10px;">
<ons-page>
    <ons-toolbar>
        <div class="center">MyOnsennApp</div>
    </ons-toolbar>
    
    <div>
    
        <section style="padding: 8px">
            <p>※サンプルページ。</p>
        </section>
        
        <section style="padding: 8px">
            <input type="text" id="text1" class="text-input text-input--underbar" placeholder="text">        
        </section>

        <section style="padding: 8px">
            <ons-button modifier="large" onclick="btnClick();">Click</ons-button>
        </section>

    </div>
    
</ons-page>

</body>
</html>

www/main.js

ons.ready(function() {
    console.log('Onsen UI is ready!');    
});

function btnClick(){
    var str = document.getElementById('text1').value;
    ons.notification.alert({
        'title':'Alert',
        'message':'Hello,' + str + '!!'
    });
}

image

textのところに、MONACAと入れて、Clickボタンをクリックすると、以下のように、Hello Worldができた。思っていたより簡単でよい!

image

(3)initialDB を試してみる
(掌田津耶乃 つくりながら覚えるスマホゲームプログラミング Chapter 7)

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:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
  <script src="components/loader.js"></script>
  <script src="lib/onsenui/js/onsenui.min.js"></script>

  <link rel="stylesheet" href="components/loader.css">
  <link rel="stylesheet" href="lib/onsenui/css/onsenui.css">
  <link rel="stylesheet" href="lib/onsenui/css/onsen-css-components.css">
  <link rel="stylesheet" href="css/style.css">
  
  <script src="main.js"></script>
</head>

<body style="margin: 8px;" onload="initlaDB();">

<ons-page>
    <ons-toolbar>
        <div class="center">DBApp</div>
    </ons-toolbar>
    
    <div>  
        <section style="padding: 8px">
            <div id="data"></div>
        </section>
        
        <hr />
        
        <section style="padding: 20px">
            <div><input type="text" id="text1" class="text-input--underbar" id="user" placeholder="user name"></div>        
            <div><input type="text" id="text1" class="text-input--underbar" id="mail" placeholder="mail address"></div>
            <div><input type="text" id="text1" class="text-input--underbar" id="tel" placeholder="tel number"></div>
            <div style="margin: 8px"><input type="button" class="button" value="Add DB" onClick="addData();"></div>
        </section>
    </div>
</ons-page>

</body>
</html>

image

main.js

var IndexedDB;
var idb;

// 初期化処理
function initialDB() {
    var request = window.indexedDB.open("MyDatabase", 10);
    
    // エラー時の処理
    request.onerror = function(event) {
        alert("ERROR!");
    };
    // 成功時の処理
    request.onsuccess = function(event) {
        idb = event.target.result;
        createList();
    };
    // 更新時の処理
    request.onupgradeneeded = function(event) {
        var idb = event.target.result;
        if (idb.objectStoreNames.contains('mydata')) {
            idb.deleteObjectStore('mydata');
        }
        var store = idb.createObjectStore("mydata", { keyPath: 'id', autoIncrement: true});
        store.createIndex("user", "user", {unique: true});
    };
}    


// データの新規作成
function addData() {
    if (!idb) return;
    var user_str = document.getElementByI("user").value;
    var mail_str = document.getElementByI("mail").value;
    var tel_str = document.getElementByI("tel").value;
    var data = { user: user_str, email: mail_str, tel:tel_str };
    var transaction = idb.transaction(["mydata"], 'readwrite');
    var store = transaction.objectStore("mydata");
    store.put(data);
    createList();
}    
   
// データの一覧リスト作成
function createList() {
    var div = document.getElementById('data');
    div.innerHTML = '<h3>Data List</h3>';
    var transaction = idb.transaction(["mydata"], 'readonly');
    var store = transaction.objectStore("mydata");
    var range = IDBKeyRange.lowerBound(0);
    var request = store.openCursot(range);
    request.onsuccess = function(event) {
        var cur = event.target.result;
        if (!cur) return;
        var res = document.createElement('p');
        res.innerHTML = cur.value.id + ': <b>' + cur.value.user + '</b>(' + cur.value.email + ')';  
        div.appendChild(res);
        cur.continue();
    };
    request.onerror = function(event) {
        alert("ERROR: " + event);
    }
}

image

うまくいかないので、手元のスマホで、monacaデバッガ―でデバッグ?すると、エラーが表示される。

image

エラーを見ながら、スクリプトを訂正。

image

それでもダメ。

image

main.jsの32行目が

image

で、ググると、これは、getElementByIdがどうたらこうたらと、、、

仕方がないので答えを見る。

http://www.mdn.co.jp/di/book/3216303012/

image

本に記載のコードと違うんですけど!(爆)

しかも、書き換えてもうまくいかず、、がっくし、、、

がちゃがちゃいじったら、一応、できたよう。

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:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
    <script src="components/loader.js"></script>
    <script src="lib/onsenui/js/onsenui.min.js"></script>

    <link rel="stylesheet" href="components/loader.css">
    <link rel="stylesheet" href="lib/onsenui/css/onsenui.css">
    <link rel="stylesheet" href="lib/onsenui/css/onsen-css-components.css">
    
    <script src="main.js"></script>
</head>
<body style="margin:8px;" onload="initialDB();">

<ons-page>
    <ons-toolbar>
        <div class="center">DB App</div>
    </ons-toolbar>
    
    <div>
        <section style="padding: 8px">
            <div id="data"></div>
        </section>

        <hr />

        <section style="padding: 20px">
            <div><input type="text" class="text-input--underbar" 
                id="user" placeholder="user name"></div>
            <div><input type="text" class="text-input--underbar" 
                id="mail" placeholder="mail address"></div>
            <div><input type="text" class="text-input--underbar" 
                id="tel" placeholder="tel number"></div>
            <div style="margin:8px"><input type="button" class="button" 
                value="Add DB" onclick="addData();"></div>
        </section>

    </div>
</body>
</html>

main.js

var IndexedDB;
var idb;
 
// 初期化処理
function initialDB(){
    //var indexedDB = window.indexedDB || window.mozIndexedDB || window.msIndexedDB || window.webkitIndexedDB;
    alert(indexedDB);
    var request = indexedDB.open("MyDatabase",10);
    alert(request);
    
    // エラー時の処理
    request.onerror = function(event) {
        alert("ERROR!");
    };
    // 成功時の処理
    request.onsuccess = function(event) {
        idb = event.target.result;
        createList();
    };
    // 更新時の処理
    request.onupgradeneeded = function(event) {
        var idb = event.target.result;
        if (idb.objectStoreNames.contains('mydata')) {
            idb.deleteObjectStore('mydata');
        }
        var store = idb.createObjectStore("mydata", 
            { keyPath: 'id', autoIncrement: true });
        store.createIndex("user", "user", { unique: true });
    };
}

// データの新規作成
function addData(){
    if (!idb){ 
        alert('no database.');
        return;
    }
    var user_str = document.getElementById("user").value;
    var mail_str = document.getElementById("mail").value;
    var tel_str = document.getElementById("tel").value;
    var data = { user: user_str, email: mail_str, tel:tel_str };
    var transaction = idb.transaction(["mydata"],'readwrite');
    var store = transaction.objectStore("mydata");
    store.put(data);
    createList();
}

// データの一覧リスト作成
function createList(){
    var div = document.getElementById('data');
    div.innerHTML = '<h3>Data List</h3>';
    var transaction = idb.transaction(["mydata"],'readonly');
    var store = transaction.objectStore("mydata");
    var range = IDBKeyRange.lowerBound(0);
    var request = store.openCursor(range);
    request.onsuccess = function(event){
        var cur = event.target.result;
        if (!cur) return;
        var res = document.createElement('p');
        res.innerHTML = cur.value.id + ': <b>' + 
            cur.value.user + '</b> (' + cur.value.email + ')';
        div.appendChild(res);
        cur.continue();
    };
    request.onerror = function(event){
    alert("ERROR: " + event);
    }
}

image

● 検索1

// 検索1 完全一致
function findData() {
    if (!idb) return;
    var user_str = document.getElementById('user').value;
    var transaction = idb.transaction(['mydata'], 'readonly');
    var store = transaction.objectStore('mydata').index('user');
    var request = store.get(user_str);
    request.onsuccess = function(event){
        var val = request.result;
        var res = document.createElement('p');
        if (!val) {
            res.innerHTML = '<p>not found...</p>';    
        } else {
            res.innerHTML = val.id + ': <b>' + val.user + '</b> (' + val.email +')';
        }
        var div = document.getElementById('data');
        div.innerHTML = '<p><b>* FIND DATA *</b></p>';
        div.appendChild(res);
        cur.continue();
    };
    request.onerror = function(event) {
        alert("ERROR: " + event);
    }
}

image

image

● 検索2

//検索2 部分一致
function searchList() {
    var find_str = document.getElementById('user').value;
    var div = document.getElementById('data');
    div.innerHTML = '<h3>Data List</h3>';
    var transaction = idb.transaction(["mydata"], 'readonly');
    var store = transaction.objectStore("mydata").index('user');
    var range = IDBKeyRange.bound(find_str, find_str + '\uffff');
    var cursor = store.openCursor(range);
    cursor.onsuccess = function(event) {
        var cur = event.target.result;
        if (!cur) return;
        var res = document.createElement('p');
        res.innerHTML = cur.value.id + ': <b>' + cur.value.user + '</b> (' + cur.value.email + ')';
        div.appendChild(res);
        cur.continue();
    }
    cursor.onerror = function(event) {
        alert("ERROR: " + event);
    }
}

image

image

面白い!同じことが、NCMBでもできたらもっといいのだけれど、、、

本当は、デバッガーで、

Uncaught ReferenceError: cur is not defined www/main.js :88

というログが出ている。たしかに、findData()関数の中で、curは定義していない。。。しかし、よくわからないので訂正しようがない。

関連記事
Count per Day
    Popular Posts
    スポンサーリンク

    シェアする

    • このエントリーをはてなブックマークに追加

    フォローする