【翻譯】HTML5開發——輕量級Web Database存儲庫html5sql.js


 

 

方式1:

html5sql官方網址:http://html5sql.com/

閱讀之前,先看W3C關於WEB Database的一段話:

Beware. This specification is no longer in active maintenance and the Web

 

Applications Working Group does not intend to maintain it further. 

意味着WEB Database規范陷入僵局。

 

html5sql官方網址:http://html5sql.com/

簡述

   html5sql是一個讓HTML5 Web Database使用更方便的輕量級JavaScript模塊,它的基本功能是提供在一個事務中順序執行SQL語句的結構。雖然 Web Database並沒有停止前進的腳步,這個模塊僅僅可以簡化與數據庫的交互過程。這個模塊還包含有其他很多小細節以便開發人員能夠更簡單,自然便捷的工作。

核心特征

1、提供以不同方式順序執行SQL語句的能力:
單條SQL語句
一組SQL語句
一組SQL語句對象(當你要想SQL中注入數據或者在SQL執行后調用一個回調函數時,可能需要使用這種形式)
從一個分割完畢包含SQL語句的文件中
2、提供一個控制數據庫版本的框架

 例子

  如果你用過HTML5 web database,你就會發現它有多蛋疼,尤其是當你開始建立你的表時。好了,現在你會發現這些都不是問題。為了更清楚的表明我的意思以及這個模塊的能力,看下面的例子:
  假設你打算建立一個表兵千插入一組數據到這個表里面。如果你使用html5sql的話,你只需要把所有的語句都放入一個單獨的文件中,本例中我們取名為Setup-Tables.SQL。這個文件的形式類似於

復制代碼
本例中我們取名為Setup-Tables.SQL。這個文件的形式類似於:
CREATE TABLE example (id INTEGER PRIMARY KEY, data TEXT);
INSERT INTO example (data) VALUES ('First');
INSERT INTO example (data) VALUES ('Second');
INSERT INTO example (data) VALUES ('Third');

CREATE TABLE example2 (id INTEGER PRIMARY KEY, data TEXT);
INSERT INTO example2 (data) VALUES ('First');
INSERT INTO example2 (data) VALUES ('Second');
INSERT INTO example2 (data) VALUES ('Third');
復制代碼

  有了html5sql之后,為了順序執行這些SQL語句(包括創建表),你只需要打開數據庫,然后添加下面一段代碼就可以了。

 $.get('Setup-Tables.SQL',function(sqlStatements){

復制代碼
    html5sql.process(
//This is the text data from the SQL file you retrieved
sqlStatements,
function(){
// After all statements are processed this function
// will be called.
},
function(error){
// Handle any errors here
}
);
});
復制代碼

   借助於jQuery的get方法,你已經從單獨的文件('Setup-Tables.SQL')獲得了SQL語句,並且按照出現的順序分割執行了。

性能

  上面的描述聽起來還不錯,不過你可能會問SQL順序執行的時候性能是不是會受損。答案就是,影響不算明顯,至少就我看來目前是這樣。
比如,我用 Google的Chrome桌面版創建一張表,然后向表中順序插入10,000條記錄,整個執行過程的時間有波動,不過平均值處於2-6秒的范圍內,因此我有理由相信html5sql在處理大量數據的時候會有不俗的表現。

 

建議

  SQL的核心被設計為一種順序執行的語言,某些語句必須在其他的語句前面執行。比方說,在插入記錄之前,你必須先創建一張表。相反的,javascipt是一種異步、事件驅動的語言。對於開發者來說,這些異步特征增加了HTML5客戶端數據庫規范與說明的復雜性。寫這個庫的時候,W3C已經不再維護Web SQL Database規范了。盡管如此,由於webkit已經實現了設個接口,而且由於webkit內核瀏覽器的龐大用戶群,尤其是移動設備上,因此這個庫還是有用的。

   雖然這個模塊減少了HTML5 SQL database的復雜程度,但是並沒有簡化SQL本身,這是有意而為之的。SQL是一門強大的語言,

盲目的簡化它只會弄巧成拙。在我的經驗中,學好SQL才是王道,大勢所趨撒。

 

用戶指南

html5sql模塊中內建了3個函數:

 html5sql.openDatabase(databaseName, displayName, estimatedSize)

  html5sql.openDatabase是對原生openDatabase方法的一個封裝,這個方法打開一個數據庫連接並返回對連接的引用。
這是所有其他操作之前的第一步。
這個方法有三個參數:
databaseName - 數據庫的名字.任意你喜歡的有效的名字,通常可以是“com.yourcompany.yourapp”之類的
displayName - 數據庫描述信息
estimatedSize - 數據庫大小.5M = 5*1024*1024

   如果讀者熟悉web database原生方法的話,會發現上面的封裝中少了版本信息這個參數。當你需要改變數據庫的表結構時,版本信息是一個得力的標識工具,

改變版本的這個方法被封裝成html5sql的changeVersion方法。
  現在,我們創建一個通常的數據庫連接:

 html5sql.openDatabase(

     "com.mycompany.appdb",
"The App Database"
3*1024*1024);

2、

 html5sql.process(SQL, finalSuccessCallback, errorCallback)

 html5sql.process()方法是所有功能的載體,一旦你創建了數據庫連接,就可以傳遞SQL語句,剩下的事情就交給html5sql.process(),他會保證SQL順序執行。

html5sql.process()的第一個參數是SQL語句,其傳遞形式有許多種:
(1)、字符串形式 - 你可以向process方法傳遞一個簡單字符串,形如:
"SELECT * FROM table;"
或者一組用分號(“;”)連接的簡單字符串,形如:

復制代碼
"CREATE table (id INTEGER PRIMARY KEY, data TEXT);" +
"INSERT INTO table (data) VALUES ('One');" +
"INSERT INTO table (data) VALUES ('Two');" +
"INSERT INTO table (data) VALUES ('Three');" +
"INSERT INTO table (data) VALUES ('Four');" +
"INSERT INTO table (data) VALUES ('Five');"
復制代碼

(2)、來自獨立文件的SQL語句。來自獨立文件的SQL語句的例子跟上面的例子一樣,沒有本質區別。
(3)、一組SQL語句字符串,你可以向html5sql.process()傳遞一組SQL語句,形如:

復制代碼
 [
"CREATE table (id INTEGER PRIMARY KEY, data TEXT);",
"INSERT INTO table (data) VALUES ('One');",
"INSERT INTO table (data) VALUES ('Two');",
"INSERT INTO table (data) VALUES ('Three');",
"INSERT INTO table (data) VALUES ('Four');",
"INSERT INTO table (data) VALUES ('Five');"
]
復制代碼

(4)、一組SQL語句對象。這是一種最實用的形式,直接傳遞一組SQL語句對象。SQL語句對象的結構域原生executeSQL 方法的參數一致,有三個部分:
SQL[string]——包含SQL語句的字符串,其中可以包含替換符“?”
data[array]——一組需要插入到SQL語句中替換?符號的數據,其中SQL語句中?的數量必須與data中數據的數量一致
success (function)——執行完SQL語句后回調的函數,可以處理SQL語句的執行結果。另外,如果這個方法返回一個數組,這個返回的數組還可以作為下一條SQL語句的data參數來執行。這樣就允許你在SQL執行中調用將上一條SQL語句的結果,在使用外鍵的情況中,這個比較常見。
或許最簡單的定義以及使用這個對象的方式是只用對象字面量。通用的模板類似下面的形式:

復制代碼
 {
"sql": "",
"data": [],
"success": function(transaction, results){
//Code to be processed when sql statement has been processed
}
}
復制代碼

 因此,一個簡單的SQL對象參數實例如下:

復制代碼
  [
{
"sql": "INSERT INTO contacts (name, phone) VALUES (?, ?)",
"data": ["Joe Bob", "555-555-5555"],
"success": function(transaction, results){
//Just Added Bob to contacts table
},
},
{
"sql": "INSERT INTO contacts (name, phone) VALUES (?, ?)",
"data": ["Mary Bob", "555-555-5555"],
"success": function(){
//Just Added Mary to contacts table
},
}
]
復制代碼

  上面的對象中,唯一與原生executesql()不同的是,沒有error部分的處理方式,這是因為有一個通用的錯誤處理回調函數來處理出現error的情況,從而避免每條語句都進行error定義。這個通用的錯誤處理函數就是 html5sql.process()的第三個參數。

小結

html5sql.process()總共有三個參數,
SQL - 上面敘述的任一種形式均可
finalSuccessCallback - 一個最終的,在所有SQL成功執行完畢后觸發
errorCallback - 處理本過程中的所有錯誤的通用函數,發生任何錯誤時,當前事務會回滾,數據庫版本不改變。
總結一下,這個方法的一個完整示例如下:

復制代碼
 html5sql.process(
[
"DROP TABLE table1",
"DROP TABLE table2",
"DROP TABLE table3",
"DROP TABLE table4"
],
function(){
console.log("Success Dropping Tables");
},
function(error, statement){
console.error("Error: " + error.message + " when processing " + statement);
}
);
復制代碼

3、

html5sql.changeVersion("oldVersion","newVersion",SQL,successCallback,errorCallback)

  html5sql.changeVersion()是創建、遷移數據庫以及處理版本所需要的方法。這個方法會檢測當前版本與舊的版本參數(oldVersion)是否一致,如果吻合的話,就會執行參數中的SQL語句,並改變數據庫的版本為 newVersion參數所示的值。
oldVersion - 需要修改的數據庫的版本號,默認初始值為""
newVersion - 你賦的新值
SQL - 你要執行的SQL語句.具體說明參見html5sql.process()部分
finalSuccessCallback - 成功執行后調用的函數
errorCallback - 通用數據處理函數,與html5sql.process()中一樣, 發生錯誤的時候,整個事務回滾,並且不改變版本號。

 

源碼深入

 

  本JS庫最大的問題就是如果要同時操縱多個數據庫,那么就會引起混亂,這一點作者似乎並沒有做多考慮。另外就是對於這種批量執行SQL語句的錯誤恢復處理感覺還是不夠完善。

補充一:

html5sql.openDatabase()其實有四個參數

復制代碼
html5sql.openDatabase = function (name, displayname, size, whenOpen) {
html5sql.database = openDatabase(name, "", displayname, size);
readTransactionAvailable = typeof html5sql.database.readTransaction === 'function';
if (whenOpen) {
whenOpen();
}
};
復制代碼

最后的whenOpen是在獲取數據庫引用的時候觸發的。

補充二:
  另外還有兩個用於調試的屬性,logErrors和logInfo:默認都是false,設置為true的時候可以看到每一步操作的過程。由於調用的是控制台的console.log,可能在某些瀏覽器上引發錯誤。

補充三:

  對於process方法,不論你采用什么形式的SQL參數,最終都會被轉換成SQL對象的形式。
  當SQL語句包含的僅僅只有SELECT操作時,內部使用的是readTransaction方法,注意一下readTransaction與transaction的區別。
這邊用的是readTransaction,這是為了保證不對表進行寫操作,這是一種安全的舉措,當然也可以用transaction。不過readTransaction方法存在一定的兼容性問題,所以使用之前應該保證檢測無誤。


轉載請注明來自小西山子【http://www.cnblogs.com/xesam/
本文地址:http://www.cnblogs.com/xesam/archive/2012/03/10/2389365.html

 

 

 

 

方式2【sql.js】:

關於js訪問sqlite數據庫的支持,可以使用:https://github.com/kripken/sql.js/
數據量不大的情況支持還行,如果單表數據量過大還是不建議直接使用js操作sqlite.

write a database to the disk

You need to convert the result of db.export to a buffer

var fs = require("fs"); // [...] (create the database) var data = db.export(); var buffer = new Buffer(data); fs.writeFileSync("filename.sqlite", buffer);

See : https://github.com/kripken/sql.js/blob/master/test/test_node_file.js

 

方式3【關於js對sqlite的支持】:

來源:http://ask.dcloud.net.cn/article/233
看到問題咨詢里有一些關於js是否支持Sqlite的問題,這里拋磚引玉。答案是可以支持。
在github上已經有關於這塊的代碼支持:[https://github.com/kripken/sql.js/](https://github.com/kripken/sql.js/),打開鏈接地址我們可以看到各種連接辦法。例如:node.js,瀏覽器支持等。
如果我們手上已經有了sqlite的數據庫,可以直接添加到我們的app項目中來,通過如下代碼方式直接訪問:
var xhr = new XMLHttpRequest(); xhr.open('GET', 'assets/test.db', true);//在App中的相對路徑 xhr.responseType = 'arraybuffer';  xhr.onload = function(e) { var uInt8Array = new Uint8Array(this.response); var db = new SQL.Database(uInt8Array); var contents = db.exec("SELECT * FROM my_table");//執行查詢語句 // contents is now [{columns:['col1','col2',...], values:[[first row], [second row], ...]}] //查詢結果獲取辦法contents [i].values }; xhr.send();

方式4【基於facebook的native的sqlite插件】:

還有一種是通過native去訪問原生的sqlite。比如這個基於facebook的native的sqlite插件。

https://github.com/almost/react-native-sqlite

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM