monacaでクイズアプリ(1)
前回は、以下の写経もどきをしてみたが、クイズ作成までは至らなかった。
http://twosquirrel.mints.ne.jp/?p=11454
今回は、以下の本の、Chapter7を写経する。最終的には、できれば、データベースは、niftymobilebacendを使いたい。
(0)WEBブラウザに用意されているデータベース、Web SQLデータベースと、IndexedDB
そんなものがあるなんて知らなかった。とりあえず、IndexedDB(iPhoneでは微妙らしい。)
最終的には、データベースは、NCMBを使いたい。
(1)monacaアプリの新規作成
(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 + '!!'
});
}
textのところに、MONACAと入れて、Clickボタンをクリックすると、以下のように、Hello Worldができた。思っていたより簡単でよい!
(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>
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);
}
}
うまくいかないので、手元のスマホで、monacaデバッガ―でデバッグ?すると、エラーが表示される。
エラーを見ながら、スクリプトを訂正。
それでもダメ。
main.jsの32行目が
で、ググると、これは、getElementByIdがどうたらこうたらと、、、
仕方がないので答えを見る。
http://www.mdn.co.jp/di/book/3216303012/
本に記載のコードと違うんですけど!(爆)
しかも、書き換えてもうまくいかず、、がっくし、、、
がちゃがちゃいじったら、一応、できたよう。
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);
}
}
● 検索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);
}
}
● 検索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);
}
}
面白い!同じことが、NCMBでもできたらもっといいのだけれど、、、
本当は、デバッガーで、
Uncaught ReferenceError: cur is not defined www/main.js :88
というログが出ている。たしかに、findData()関数の中で、curは定義していない。。。しかし、よくわからないので訂正しようがない。


ディスカッション
コメント一覧
まだ、コメントがありません