Der Android-Browser (4.1.1) kann irgendwie KEIN AJAX?

R

ralphi

Neues Mitglied
0
Hi Zusammen,

ich habe ein Problem, was eigentlich, in der heutigen Zeit, nicht mehr vorkommen dürfte.
Ich möchte mit JQuery mobile und SQLite ein kleines Tool (zB. für Aussendienstler) schreiben. Also Standartanwendung (Offline)!

Der Android-Browser (4.1.1) unterstützt SQLite als einziger der mir verfügbaren Browser:

SQLite unter Android-Browser:
(funkt nicht bei anderen-Browsern zB Firefox)
Code:
function initDb() {
            var shortName = 'myDB';
            var version = '1.0';
            var displayName = My DB;
            var maxSize = 1048576; // in bytes
            mydb = window.openDatabase(shortName, version, displayName, maxSize);
 } 
 
function init() {
               if (!window.openDatabase) {
                  alert("SQLite DB ist nicht verfügbar");
               } else {
                  initDb();
               }
}

Der Android-Browser (4.1.1) kann aber irgendwie KEIN AJAX. (oder ich bin zu doof)

Ohne Jquery mobile:
Code:
<a href="akte.htm“></a>
kein Fehler

Mit:
Code:
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script src="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.js"></script>
Code:
<a href="akte.htm“></a>
Fehler
Code:
<a href="file:///sdcard/akte.htm“></a>
Fehler

Code:
<a href="http://192.168.123.1/mobil/ akte.htm ">
kein Fehler

Code:
$.get(mylink,function(data,status)
Fehler

Code:
var xmlhttp=new XMLHttpRequest();         
xmlhttp.open("GET",mytext,true);
            xmlhttp.onreadystatechange=function()
            {
             if (xmlhttp.readyState==4 && xmlhttp.status==200)
                        {
                                       alert(xmlhttp.responseText);                                     
                         }
             }
                        xmlhttp.send();
auch Fehler


Was mach ich falsch??

In FireFox und ‚Noname Browser’ funktioniert Ajax problemlos!! (Ausser SQLite)

Es kann doch nicht sein, das der Android- Browser, als einziger kein Ajax und damit Jquery-mobile, nicht kann!? :bored:
Auf Google play komm ich mit dem Tablet (Coby) nicht und bin deshalb etwas eingeschränkt im experimentieren.

In der Hoffnung auf Lösungsvorschläge :razz:
Viele Grüße aus LA
ralphi
 
Klar kann Android Ajax. Sonst würde man nicht sinnvoll im Netz Surfen können :D

Du verletzt in den meisten Beispielen die "Same Origin Policy" von Javascript. Das kann dann natürlich nicht laufen. (die Fehlermeldungen wären sicher hilfreich gewesen). Achja, hat deine App überhaupt Internetzugriffsrechte?

Du sagst, dass deine App eine Offlineanwendung sein soll. Mit welchem Webserver willst du denn dann HttpRequests austauschen? Auf dem Androiden läuft erstmal keiner, es sei denn, du installierst oder schreibst einen.

Eine SQLite Datenbank ist erstmal nur eine Bibliothek, die eine DB in einer Datei für SQL-Befehle zugänglich macht. Für Zugriff via HttpRequests braucht man wieder eine Serverinfrastruktur.

Man könnte evtl etwas mit HttpRequestInterception erreichen. Aber die Schnittstelle zu SQLite must du dann noch immer selber ins Boot holen, wenn du nicht die Android Speziallösung nehmen willst.
 
Zuletzt bearbeitet:
Hi Goldi,

Achja, hat deine App überhaupt Internetzugriffsrechte?
Web-App und Query-mobile!? - klar.
Mit richtige Apps möchte ich mich später noch versuchen. Hab zwar schon ein bisserl in Eclpise und das Tutorial ‚Hello Word’ von Google durchgesehen. Aber noch bin ich auf dem Stand von Microsofts 'Vorstufe von App’s' - den WinGets (sehr kleines Manifest :razz:) also Javascrip nicht Java.

Dummerweise hat heute mein Tablet (Coby) aufgegeben – Startet nicht mehr - Muss ich wohl einsenden. :bored:

Bezüglich Ajax hast Du recht.
Ich habe auch bei den Wingets immer die zu ladende Datei (war meist php), immer auf meinem htdocs gehabt. Deshalb ist es mir wahrscheinlich nicht richtig aufgefallen, dass es ohne Server nicht geht.
Aber noch etwas hat mich zuversichtlich gemacht, dass es gehen könnte:

Das Tutorial in CT Programmieren03/12 - Zitat:
… Alle Links auf andere Seiten, die in HTML enthalten sind, werden von JQuery Mobile erkannt und durch ein Nachladen per AJAX ersetzt.
Jetzt hab ich weitergelesen:
Aus Sicherheitsgründen … (Same Origin Policy) lassen dies viele Browser nur bei Seiten zu , .. derselben Domäne .. Ist dies nicht der Fall, wird das Laden der Seite an den Browser deligiert.
Jetzt bin ich zwar schlauer, aber immer noch am selben Punkt.

HTML:
<a href="akte.htm“></a>

Macht er bei Firefox und Co (Offline) und nicht bei Android-Browser.

Du sagst, dass deine App eine Offlineanwendung sein soll. Mit welchem Webserver willst du denn dann HttpRequests austauschen?
Offline im (zB Funkloch etc.) – deshalb auch SQLite (ist ja nicht nur eine Bibliotek und nicht temporärer Arbeitsspeicherbereich sondern richtige Dateien! )
‚Pseudo Replizieren’ mit einem MySql Server sollte als nächstes folgen. Den Platz der SQLite Dateien im Tablet hab ich noch nicht gefunden. Ich möchte sie mit USB auf den lokalen Rechner ziehen und aktuallisieren. Was ich bis jetzt gelesen habe, ist Win-SQLite nicht 100% identisch, bezüglich Spalten Deklaration. Bei einer der Versionen ist sie (INTEGER, etc.) nicht nötig?! Ich hoffe man muss die Dateien nicht anpassen.

Man könnte evtl etwas mit HttpRequestInterception erreichen
find ich nichts darüber im Web.

. .. noch immer selber ins Boot holen, ..
Kann es sein, dass Du hier bei Apps (Eclipse) bist und nicht bei WEB-Apps? :confused2:

Viele Grüße aus LA
ralphi
 
ralphi schrieb:
Kann es sein, dass Du hier bei Apps (Eclipse) bist und nicht bei WEB-Apps?

Eher ja. Ich dachte, du willst eine App basteln, die im Wesentlichen aus HTML Seiten besteht. Da wäre dann in Eclipse auch nicht viel zu coden. In diesem Context kann man dann mit Http request interception (WebViewClient) eine Menge tolle Sachen machen :D

Dass eine Onlineanwendung direkt auf lokale SQLite Daten zugreifen kann (ohne eine ggf lokale nerzwerk verbindung), wäre mir neu.
 
HTML:
[COLOR=green]<a href="akte.htm“></a>[/COLOR]
Klappt bei Dir der einfache lokale (offline) Link im Android-Browser? Bitte testen :winki:

Dass eine Onlineanwendung direkt auf lokale SQLite Daten zugreifen kann (ohne eine ggf lokale nerzwerk verbindung), wäre mir neu.
Doch funktioniert prima und ist nicht temporär wie zB. bei sqlite.js.
Die Quelle des Beispiels find ich nicht mehr in meinen Bookmarks, deshalb hier der ursprüngliche Code, statt Link zum ausprobieren:
(Sobald ich die Quelle habe, werde ich sie natürlich nachtragen – möchte mich ja nicht mit fremden Federn schmücken :rolleyes2:)

Code:
<!DOCTYPE html>
<html xmlns="http://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>
Ich hab den Code schon mal mit den Stammdaten meiner Anwendung und JQuery angepasst. Die Daten bleiben erhalten und wie gewohnt mit Insert und Select ansprechbar..
 
ralphi schrieb:
HTML:
[COLOR=green]<a href="akte.htm“></a>[/COLOR]
Klappt bei Dir der einfache lokale (offline) Link im Android-Browser? Bitte testen :winki:

Das ist ein relativer Link. Frage ist: relativ zu was?

Doch funktioniert prima und ist nicht temporär wie zB. bei sqlite.js.

Cool, muss ich bei Gelegenheit mal ausprobieren. Aber ich finde es irgendwie schon beängstigend, dass irgendwelche dahergelaufenen Webseiten auf meiner Maschine nicht nur Cookies und LSO, sondern nun auch ganze Datenbanken anlegen dürfen. :D
 
Das ist ein relativer Link. Frage ist: relativ zu was?

Also folgende Dateien im gleichen Verzeichnis (nicht auf einem Server!)

HTML:
<html>
<head>
<meta http-equiv="Content-Language" content="de">
<title>Seite 1</title>
</head>
<body>
<h1><a href="seite2.html">Link zu Seite2 ohne Server</a></h1>
</body>
</html>
Zum aufrufen ‚Seite2.html’:

HTML:
<html>
<head>
<title>link</title>
</head>
<body>
Das ist eine Offline Datei nicht auf einem Server
</body>
</html>
Unter Windows einfach aufrufen mit zB. IE oder Standard Browser mit Doppelklick. ->
Link funktioniert.
Unter Android funktioniert er auch mit FF und Noname-Browsern.
Unter Mac und Linux kann ich nicht testen.
Unter Android-Browser funktioniert der Link nicht „Page Load Error“ o.ä.

Auf mein Tablet muss ich noch warten. Kann also derzeit nix ausprobieren.
Vielleicht habe (hatte) ich ja nur einen Konfigfehler. Probier doch bitte den Link bei Dir aus. :winki:
Aber ich finde es irgendwie schon beängstigend, dass irgendwelche dahergelaufenen Webseiten auf meiner Maschine nicht nur Cookies und LSO, sondern nun auch ganze Datenbanken anlegen dürfen. :D
An die Sicherheit dabei, hab ich noch gar nicht gedacht. – Stimmt aber, möglich wäre es schon.
Bezüglich Web-App zu App:
Das reizvolle für mich, an einer WEB-App ist halt die Plattformunabhängigkeit. Browser mit HTML5 und meist für jede Plattform SQLite sind eigentlich Standard. Wenn’s fertig ist, müsste die Web-App auch auf Apple, MS und Linux laufen – oder?
 

Ähnliche Themen

F
  • Fischi84
Antworten
2
Aufrufe
1.916
Fischi84
F
M
Antworten
4
Aufrufe
1.173
swa00
swa00
5
Antworten
0
Aufrufe
1.151
586920
5
Zurück
Oben Unten