h5緩存之數據庫


/*=======================================================
    函數功能:保存日志到本地數據庫
=======================================================*/
function saveLog(str)
{
    var db = window.openDatabase("web", "1.1", "log", 1024 * 1024);

    // 創建或打開數據庫失敗
    if(!db) { return; }

    // 創建表
    db.transaction(function(tx) {
     tx.executeSql("CREATE TABLE if not exists log (createtime TEXT, content TEXT)");
    });

    // 插入記錄
    db.transaction(function(tx) {
     tx.executeSql("INSERT INTO log (createtime, content) values(?, ?)", [new Date().Format("yyyyMMdd hh:mm:ss"), str], null, null);
    });
}

/*=======================================================
    函數功能:查詢本地數據庫里的日志信息
=======================================================*/
function selectLog(sql)
{
    var db = window.openDatabase("web", "1.1", "log", 1024 * 1024);
    // 創建或打開數據庫失敗
    if(!db) { return; }

    // 查詢數據
    db.transaction(function(tx)
    {

        if(sql == undefined || sql == "") { sql = "SELECT * FROM log"; }

        tx.executeSql(sql, [], function(tx, result)
      {
        for(var i = 0; i < result.rows.length; i++)
        {
            console.warn( result.rows.item(i)['content']);
        }
      },
      function()
      {
          console.error("查詢失敗! 原因:1、沒有創建表; 2、表中無數據");
         });
    });
}

/*=======================================================
    函數功能:清空數據庫表數據
=======================================================*/
function clearLog()
{
    var db = window.openDatabase("web", "1.1", "log", 1024 * 1024);
    // 創建或打開數據庫失敗
    if(!db) { return; }

    db.transaction(function(tx) {
     tx.executeSql("DROP TABLE log");
    });

}

1.需求背景:當用戶在頁面上添加一行一行的數據時,突然發現網絡斷掉了,頁面上編輯的數據沒法保存進數據庫,所以需要一個本地端的臨時保存功能,以便在網絡通暢后重新加載出來!

2.解決方案:

   結合網上搜刮,考慮到了這幾種方式:1)采用cookie; 2)看能不能采用瀏覽器的頁面緩存來模擬 3)使用html5

  1)cookie使用(做測試是直接用瀏覽器打開沒有效果,需要放到站點下)

     所有瀏覽器都支持,所以不需要去考慮兼容性的問題;

    瀏覽器對於同一domain最多支持20個左右cookie,每個cookie的長度也有限制,超長部分就會被截掉

    過期的限制:在cookie的生命周期內有效,過期就會被清掉

    還有就是每次對服務器的請求cookie都會附帶上去增加了網絡帶寬

   鑒於以上幾點考慮,並且項目中希望以文件形式存儲,不予考慮!

   cookie存儲操作示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function setCookie() {
     var value = $( '#data' ).val();
     if (value != '' && $.trim(value) != '' ) {
         var expireDate = new Date();
         expireDate.setTime(expireDate.getTime() + 30 * 24 * 3600 * 1000);
         document.cookie = "data=" + escape(value) + ( "; expires=" + expireDate.toGMTString());
        
     } else {
         alert( '請輸入要存儲的數據!' );
     }
}
function getCookie() {
     if (document.cookie.length > 0) {
         var startIndex = 5;
         var endIndex = document.cookie.indexOf( ";" , 0);
         var data = "" ;
         if (endIndex != -1) {
             data = unescape(document.cookie.substring(startIndex, endIndex));
             
         } else {
             data = unescape(document.cookie.substring(startIndex, document.cookie.length));
         }
         $( '#data-display' ).html(data);
     }
}

 2).localStorage

      html5本地存儲分為兩種,一是key-value對的形式存儲,一種是DateBase存儲;

    1.key-value本地存儲有sessionStorage和localStorage兩種

      sessionStorage:會話存儲,生命期從進入網站開始,從關閉網站后結束

      localStorage:本地存儲,即使關閉瀏覽器,再次打開時同樣能夠讀取到存儲的數據,這也是其與sessionStorage的區別

      示例:

1
2
window.localStorage.setItem( 'name' , 'istone' );
window.localStorage.getItem( 'name' );

  2.html5本地數據庫,提供了一套API來操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var db = openDatabase( 'mydb' , '1.0' , 'Test DB' , 2 * 1024 * 1024);
         var msg;
            
         db.transaction( function (tx) {
            tx.executeSql( 'CREATE TABLE IF NOT EXISTS LOGS (id unique, log)' );
            tx.executeSql( 'INSERT INTO LOGS (id, log) VALUES (1, "foobar")' );
            tx.executeSql( 'INSERT INTO LOGS (id, log) VALUES (2, "logmsg")' );
            msg = '<p>Log message created and row inserted.</p>' ;
            document.querySelector( '#status' ).innerHTML =  msg;
         });
 
         db.transaction( function (tx) {
            tx.executeSql( 'SELECT * FROM LOGS' , [], function (tx, results) {
               var len = results.rows.length, i;
               msg = "<p>Found rows: " + len + "</p>" ;
               document.querySelector( '#status' ).innerHTML +=  msg;
                    
               for (i = 0; i < len; i++){
                  msg = "<p><b>" + results.rows.item(i).log + "</b></p>" ;
                  document.querySelector( '#status' ).innerHTML +=  msg;
               }
            }, null );
         });

  瀏覽器支持情況

 

   3)h5File API

  對於頁面數據的保存,采用js庫將數據json化,如:JSON.stringify(),IE的數據保存網上搜到是調用瀏覽器'另存為'的功能來保存成 txt,而對於chrome的數據保存調用html5的API接口blob封裝數據提供給a標簽的href,文件名提供給download

  對於本地文件的讀取,采用html5 fileAPI:FileReader,通過readAsText方法讀取到本地json串,JSON.parser()轉回去.


免責聲明!

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



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