ralphi: Welche DB-engine haben (vielleicht alle) OS ohne install?

Hi leute,
mal eine Frage, dessen Antwort, mein Grudverständnis etwas entwirren soll.

Also von Anfang an:
in den 90'ern habe ich mal für win CE programmiert. Da ging es darum, Messwerte zu speichern.
Mit VB6 und winCE tool konnte ich mit einem einfachen befehl+SQL(tabelle war glaube ich fix 'DB'!?) daten 'irgenwo' hinspeichern und wieder abrufen.
Den Befehl weiß ich nicht mehr. ich dachte MS hätten da einen kleinen MS mini SQL-Server integriert o.ä..

Jetzt ist es so, dass ich ohne irgewelche installationen, ausser dem OS, sowohl in Win8, Win8.1, Win RT, mit Androidbrowser bzw Crome
mit:
mydb = window.openDatabase(shortName, version, displayName, maxSize);
auf irgendeine DB-engine zugreifen kann!?

Also ohne SQLite installiert zu haben.
Mit IE gehts nicht, obwohl HTML5!?

Was ist das für ein Ding, was MS und Android schon mitbringen?

grüße aus LA
ralphi

PS: der code zum ausprobieren

<!DOCTYPE html>  
<html xmlns="...www.w3.org/1999/xhtml" xml:lang="en">  
   <head>  
      <title>JS DB Test</title>  
      <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">  
      <meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type" />  
      <meta content="yes" name="apple-mobile-web-app-capable" />  
      <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>  
      <script type="text/javascript">  
  
         var mydb = null;  
  
         function initDb() {  
            var shortName = 'testDb';  
            var version = '1.0';  
            var displayName = 'test db';  
            var maxSize = 1048576; // in bytes  
            mydb = window.openDatabase(shortName, version, displayName, maxSize);  
  
         }  
  
         function init() {  
            try {  
               if (!window.openDatabase) {  
                  document.getElementById('status').innerHTML = "<b style='color: red;'>[ERROR]</b> No DB support...";  
               } else {  
                  initDb();  
                  createTables();  
                  displayPerson(null);  
               }  
            } catch(e) {  
               if (e == INVALID_STATE_ERR) {  
                  document.getElementById('status').innerHTML = "<b style='color: red;'>[ERROR]</b> Invalid database version.";  
               } else {  
                  document.getElementById('status').innerHTML = "<b style='color: red;'>[ERROR]</b> Unknown error "+e+".";  
               }  
               return;  
            }  
         }  
  
         errorHandler = function (transaction, error) {  
            document.getElementById('status').innerHTML = "<b style='color: red;'>[ERROR]</b> Failure: " + error.message;  
            return true;  
         }  
  
         // fire and forget...  
         nullDataHandler = function (transaction, results) { }  
  
         // create tables for the database  
         function createTables() {  
            try {  
               mydb.transaction(  
               function(transaction) {  
                  transaction.executeSql('CREATE TABLE IF NOT EXISTS person(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, first_name VARCHAR NOT NULL, last_name VARCHAR NOT NULL);', [], nullDataHandler, errorHandler);  
                  document.getElementById('status').innerHTML = "<b style='color: green;'>[OK]</b>Created table 'person'";  
               });  
            } catch(e) {  
               document.getElementById('status').innerHTML = "<b style='color: red;'>[ERROR]</b> Unable to create db 'person' "+e+".";  
               return;  
            }  
         }  
  
         function insertData() {  
            var firstName = document.personForm.firstName.value;  
            var lastName  = document.personForm.lastName.value;  
            if (firstName == "" || lastName == "") {  
               document.getElementById('status').innerHTML = "<b style='color: red;'>[ERROR]</b> 'First name' and 'Last name' are required fields!";  
            } else {  
               try {  
                  mydb.transaction(  
                  function(transaction) {  
                     transaction.executeSql("insert into person (first_name, last_name) VALUES ('"+firstName+"', '"+lastName+"');", [],  
                     function (transaction, results) {  
                        if (!results.rowsAffected) {  
                           document.getElementById('status').innerHTML = "<span style='color: red;'>No rows affected</span>";  
                        } else {  
                           document.personForm.firstName.value = "";  
                           document.personForm.lastName.value  = "";  
                           document.getElementById('status').innerHTML = "<span style='color: green;'>Inserted row with id "+results.insertId+"</span>";  
                           displayPerson(results.insertId);  
                        }  
                     }, errorHandler);  
                  });  
               } catch(e) {  
                  document.getElementById('status').innerHTML = "<b style='color: red;'>[ERROR]</b> Unable to perform an INSERT "+e+".";  
               }  
            }  
         }  
  
         displayPerson = function(personId) {  
            var query;  
            if (personId != null) {  
               query = "SELECT * FROM person where id="+personId;  
            } else {  
               query = "SELECT * FROM person";  
            }  
            try {  
               mydb.transaction(  
               function(transaction) {  
  
                  transaction.executeSql(query,  
                  [ ],  
                  function (transaction, results) {  
                     for (var i=0; i<results.rows.length; i++) {  
  
                        var row = results.rows.item(i);  
                        var tr     = document.createElement("tr");  
  
                        var tdId   = document.createElement("td");  
                        var idText = document.createTextNode(row['id']);  
                        tdId.appendChild(idText);  
                        tr.appendChild(tdId);  
  
                        var tdFn   = document.createElement("td");  
                        var fnText = document.createTextNode(row['first_name']);  
                        tdFn.appendChild(fnText);  
                        tr.appendChild(tdFn);  
  
                        var tdLn   = document.createElement("td");  
                        var lnText = document.createTextNode(row['last_name']);  
                        tdLn.appendChild(lnText);  
                        tr.appendChild(tdLn);  
  
                        document.getElementById("person_data").appendChild(tr);  
                     }  
                  }, function (transaction, error) {  
                     document.getElementById("status").innerHTML = "Sth. went wrong. Failure code: " + error.code + "<br />Message: " + error.message;  
                  });  
               });  
            } catch(e) {  
               document.getElementById('status').innerHTML = "<b style='color: red;'>[ERROR]</b> Unable to select data from the db "+e+".";  
            }  
         }  
  
      </script>  
   </head>  
   <body  style="font-family: Helvetica, Verdana, Arial;">  
   <button onclick="init()">start</button>  
      <h1>Person DB</h1>  
      <h4>Status</h4>  
      <div id="status" style="margin-bottom: 5px;"></div>  
      <h2>Persons</h2>  
      <table border="1" cellspacing="2" id="person_data">  
         <tr>  
            <th><b>ID</b></th>  
            <th><b>First name</b></th>  
            <th><b>Last name</b></th>  
         </tr>  
      </table>  
      <h2>Create a new person</h2>  
      <form name="personForm">  
         First name: <input style="width: 100px;" type="text" name="firstName" id="firstName" /><br />  
         Last name:  <input style="width: 100px;" type="text" name="lastName" id="lastName" /><br />  
         <br />  
         <input type="button" name="insert" value="insert" onclick="insertData()" />  
      </form>  
   </body>  
</html>  

  1. Tach!

    auf irgendeine DB-engine zugreifen kann!?
    Also ohne SQLite installiert zu haben.

    SQLite (und SQLCE ebenfalls) ist auch nicht zu installieren. Die nötige Funktionalität wird direkt (oder indirekt über eine mit ausgelieferte Bibliotheksdatei) in das fertige Programm eingebunden.

    dedlfix.

    1. hi dedlfix

      demnach ist das kein, HTML JS etc standart.
      hast du eine Idee, wie ich die DB unter Win RT ansprechen könnte? - unter ARM, MS store und solche Einschränkungen. bis jetzt find ich keinen anderen browser als IE mit Billi's genemigung.

      ralphi

  2. Hallo,

    Es gibt die clientseitige Key-Value-Datenbank indexedDB als browserübergreifender Nachfolger von WebSQL.

    Tutorial:
    http://www.peterkroener.de/indexed-db-die-neue-html5-datenbank-im-browser-teil-1-ein-kurzer-ueberblick/
    http://www.peterkroener.de/indexed-db-die-neue-html5-datenbank-im-browser-teil-2-browsermacken-tools-und-polyfills/

    Für Browser, die noch nicht indexedDB, aber WebSQL unterstützen, gibt es einen Shim:
    https://github.com/axemclion/IndexedDBShim

    Für einfache Operationen gibt es weiterhin localStorage.

    Grüße,
    Mathias

    1. Hi,

      die seite vom Peter hab ich auch schonb gefunden - wirklich gut erklährt :-)

      stellt sich natürlich die frage, ob sich ausser das team von SQLite schon jemand mal die Arbeit gemacht hat (speziell für die indexed db), dafür eine JS bibliotek zu schreiben, die ein SQL-syntax kann.
      also irgendwie sowas zB:
      1 tabelle: Anz:spalten = Anz.object stores / key = gleich
      für SELECT WHERE ein guter Algorithmus etc.
      Weiß jemand was?
      ralphi

      1. Hallo,

        stellt sich natürlich die frage, ob sich ausser das team von SQLite schon jemand mal die Arbeit gemacht hat (speziell für die indexed db), dafür eine JS bibliotek zu schreiben, die ein SQL-syntax kann.

        Nein. IndexedDB ist eine schemafreie Key-Value-Datenbank. Indizes erlauben einen spezifische Cursor, der über die passenden Datensätze iteriert.

        Das ist konzeptionell nicht mit relationalen Datenbanken vergleichbar und die APIs auch nicht ohne weiteres ineinander übersetzbar.

        Mathias