Значение базы данных HTML5 не останется при закрытии браузера - PullRequest
2 голосов
/ 14 ноября 2011

Я пытаюсь создать очень простую функциональность хранения html5, и я написал следующий код, и он работает.

JS:

function initDatabase() {
    try {
    alert("Hi");
        if (!window.openDatabase) {
            alert('Databases are not supported in this browser.');
        } else {
            var shortName = 'SOMEDB';
            var version = '1.0';
            var displayName = 'SOMEDB';
            var maxSize = 10000; //  bytes
            SOMEDB = openDatabase(shortName, version, displayName, maxSize);
            createTables();
            //selectAll();
        }
    } catch(e) {
        if (e == 2) {
            // Version number mismatch.
            console.log("Invalid database version.");
        } else {
            console.log("Unknown error "+e+".");
        }
        return;
    }
}

function createTables(){
alert("Create table");
    SOMEDB.transaction(
        function (transaction) {
            transaction.executeSql('CREATE TABLE IF NOT EXISTS page_settings(id INTEGER NOT NULL PRIMARY KEY, settingname TEXT NOT NULL,value TEXT NOT NULL);', [], nullDataHandler, errorHandler);
        }
    );
    prePopulate();
}

function prePopulate(){
alert("In pre populating");
    SOMEDB.transaction(
        function (transaction) {
        //Optional Starter Data when page is initialized
        var setting1 = ['1','setting1','setting2'];
        transaction.executeSql("INSERT INTO page_settings(id, settingname, value) VALUES ('1', 'bluetooth', 'on');",[],nullDataHandler, errorHandler);
        transaction.executeSql("commit;");
        }
    );
}

function errorHandler(transaction, error){
    if (error.code==1){
        // DB Table already exists
    } else {
        // Error is a human-readable string.
        console.log('Oops.  Error was '+error.message+' (Code '+error.code+')');
    }
    return false;
}


function nullDataHandler(){
    console.log("SQL Query Succeeded");
}

И HTML выглядит так:1006 *

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="db.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<a href="#" onClick="initDatabase();">aa</a>
</body>
</html>

Этот код работает.Как только я нажимаю href на моей html-странице, я вижу созданную таблицу, и значение вставляется. Но как только я закрываю браузер и снова открываю его, данные исчезают.

Почему-то похоже, что данные сохраняются только в сеансе.Что я здесь не так делаю?

Я загрузил подобный код в этом месте.Может кто-нибудь попробовать это и дайте мне знать, если это работает для кого-либо.Для меня та же проблема, данные сохраняются.Я перезагружаю браузер и данные исчезают.http://classictutorials.com/CTFiles/

Ответы [ 3 ]

0 голосов
/ 15 ноября 2011

Я позволил себе переписать ваш сценарий. Надеюсь, ты не против. Это сохраняется после закрытия страницы. В остальном я использовал точно такой же HTML. Я просто увидел, что я чувствую, что это лучший способ сделать это.

<script type="text/javascript" charset="utf-8">
  var exampledb = {};
  exampledb.somedb = {};
  exampledb.somedb.db = null

  exampledb.somedb.open = function() {
    try {
      alert("Hi");
      if (!window.openDatabase) alert('Databases are not supported in this browser.');
      else {
        var shortName = 'SOMEDB',
        version = '1.0',
        displayName = 'SOMEDB',
        maxSize = 10240; //  10 kbytes
        exampledb.somedb.db = openDatabase(shortName, version, displayName, maxSize);
      }
    } catch(e) {
      if (e == 2) console.log("Invalid database version.");
      else console.log("Unknown error "+e+".");
      return;
    }
  }

  exampledb.somedb.createTable = function() {
    var db = exampledb.somedb.db;
    alert("Create Table");
    db.transaction( function(tx){
      tx.executeSql('CREATE TABLE IF NOT EXISTS page_settings(id INTEGER NOT NULL PRIMARY KEY, settingname TEXT NOT NULL,value TEXT NOT NULL);', [], exampledb.somedb.onSuccess, exampledb.somedb.onError );
    });
  }

  exampledb.somedb.prePopulate = function() {
    var db = exampledb.somedb.db;
    alert("In pre populating");
    db.transaction( function(tx) {
      var setting1 = ['1','bluetooth','on'];
      tx.executeSql("INSERT INTO page_settings(id, settingname, value) VALUES (?,?,?);",[setting1[0],setting1[1],setting1[2]], exampledb.somedb.onSuccess, exampledb.somedb.onError );
    });
  }

  exampledb.somedb.onError = function(tx, e) {
    if(e.code == 1) return false;
    else console.log('Oops. Error was '+e.message+' (Code '+error.code+')');
  }

  exampledb.somedb.onSuccess = function(tx, r) {
    console.log( "SQL Query Succeeded" );
  }

  function initDatabase() {
    exampledb.somedb.open();
    if( exampledb.somedb.createTable() ) exampledb.somedb.prePopulate();
    else alert( "Table already exists!" );
  }
</script>
0 голосов
/ 15 ноября 2011

Спасибо всем за помощь. Я понял, что случилось. В основном, если вы вставите что-то в таблицу, а затем закроете и откроете браузер, а затем осмотрите его с помощью инспектора браузера, данные не будут отображаться, так как соединение БД еще не открыто. Инспектор покажет БД, но внутри нее будет пусто. Инспектор сможет показывать вам данные только тогда, когда вы открыли соединение с использованием любого сценария. Таким образом, данные на самом деле есть, но только не доступны для инспектора браузера при перезапуске. Я написал скрипт для открытия БД и чтения таблицы, и могу читать старые данные.

0 голосов
/ 14 ноября 2011

У меня была такая же проблема. Я полагаю, это из-за того, что ваш код был локальным, а не онлайн. Попробуйте добавить его на сервер и получить к нему удаленный доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...