[TOC]
## 概況
### 背景
這個項目的起源是我想錄入我的書架上的書籍——當時,大概有近四百本左右。由于大部分的手機軟件都是收費的,或封閉的,因此我便想著自己寫一個app來完成書籍的錄入。
### ShowCase
最后的效果如下圖所示:

Bookshelf
代碼見:?[https://github.com/phodal/bookshelf/](https://github.com/phodal/bookshelf/)
### Ionic + Zxing
所需要的移動框架還是Ionic,用于掃描條形碼的庫是ZXing。
## 步驟
開始之前,我們需要先安裝Ionic,并且使用它來創建一個APP。然后我們還需要添加對應的二維碼掃描庫,代碼如下所示:
~~~
phonegap plugin add phonegap-plugin-barcodescanner
~~~
接著我們就可以開始制作我們的APP了。
### Step 1: ZXing掃描與Douban API
我們需要在我們的模板里,添加一個ICON或者按鈕來觸發程序調用相應的函數:
~~~
<i class="icon icon-right ion-qr-scanner" ng-click="scan()"></i>
~~~
在我們的函數里,我們只需要調用cordovaBarcodeScanner的scan方法就可以獲取到二維碼的值。再用$http.get去獲取豆瓣API的相應的結果,并且將這個結果存儲到數據庫中。代碼如下所示:
~~~
$scope.scan = function () {
$cordovaBarcodeScanner
.scan()
.then(function (barcodeData) {
$scope.info = barcodeData.text;
$http.get("https://api.douban.com/v2/book/isbn/" + barcodeData.text).success(function (data) {
$scope.detail = data;
saveToDatabase(data, barcodeData);
});
}, function (error) {
alert(error);
});
}
~~~
隨后,我們就可以創建我們的代碼來保存數據到數據庫中。
### Step 2: 存儲數據庫
開始之前,我們需要添加Cordova的SQLite插件:
~~~
cordova plugin add https://github.com/litehelpers/Cordova-sqlite-storage.git
~~~
在系統初始化的時候,創建對應的數據庫及其表。
~~~
if(window.cordova) {
//$cordovaSQLite.deleteDB("my.db");
db = $cordovaSQLite.openDB("my.db");
} else {
db = window.openDatabase("my.db", "1.0", "bookshelf", -1);
}
$cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS bookshelf (id integer primary key, title text, image text, publisher text, author text, isbn text, summary text)");
~~~
接著,我們就可以上一步獲取的數據取出相應的字段,調用bookshelfDB服務將其存儲到數據庫中。
~~~
function saveToDatabase(data, barcodeData) {
bookshelfDB.add({
title: data.title,
image: data.image,
publisher: data.publisher,
author: data.author,
summary: data.summary,
isbn: barcodeData.text
});
}
~~~
下面就是我們的bookshelfDB服務,我們實現了get、add、remove、update,即CRUD。
~~~
.factory('bookshelfDB', function($cordovaSQLite, DBA) {
var self = this;
self.all = function() {
return DBA.query("SELECT id, title, image, publisher, author, isbn, summary FROM bookshelf")
.then(function(result){
return DBA.getAll(result);
});
};
self.get = function(memberId) {
var parameters = [memberId];
return DBA.query("SELECT id, title, image, publisher, author, isbn, summary FROM bookshelf WHERE id = (?)", parameters)
.then(function(result) {
return DBA.getById(result);
});
};
self.add = function(member) {
var parameters = [member.id, member.title, member.image, member.publisher, member.author, member.isbn, member.summary];
return DBA.query("INSERT INTO bookshelf (id, title, image, publisher, author, isbn, summary) VALUES (?,?,?,?,?,?,?)", parameters);
};
self.remove = function(member) {
var parameters = [member.id];
return DBA.query("DELETE FROM bookshelf WHERE id = (?)", parameters);
};
self.update = function(origMember, editMember) {
var parameters = [editMember.id, editMember.title, origMember.id];
return DBA.query("UPDATE bookshelf SET id = (?), title = (?) WHERE id = (?)", parameters);
};
return self;
})
~~~
### 練習建議