kolmapäev, 30. september 2009

Veebirakendus iPhone jaoks, vol 2 - andmebaas

Eelmises iPhone veebirakenduse teemalises postituses oli juttu rakenduse olemuslikust küljest - kuidas teha veebilehte, mis telefonis käituks kui rakendus. Edasi aga räägiks, et mida selle rakendusega üldse teha saaks.

Üheks olulisemaks asjaks oleks ilmselt kasutaja andmete salvestamine, mingisugune profiili loomine - kui rakendus näeks täpselt samasugune välja kõikide kasutajate korral ja selles puuduks igasugune dünaamilisus, siis poleks rakendust üldse mõtet rakendusena vormistada, vaid piisaks tühipaljast veebilehest.

Andmeid (selle all pean silmas dünaamilisi andmeid, mitte veebilehte ennast) aga ei pea vastupidiselt üldlevinud arvamusele sugugi hoidma ainult serveri poole peal, kus rakenduse avades tõmmatakse serverist andmed telefoni brauserisse. Andmeid saab ka kohe brauseri poolel hoida.

Võimalik on näiteks kasutada eelmises postituses kirjeldatud DOM storage meetodeid (sessionStorage, localStorage), kuid iPhone brauser pakub sellest palju enamat. Nimelt Safari sisaldab endas ootamatult täisfunktsionaalset SQLite andmebaasi, mida saabki ülihästi andmete salvestamiseks kasutada.

Andmebaasiühenduse saab avada järgmiselt
db = openDatabase(db_name:String, db_version:String, db_description:String, 10000);

Päringud käivitatakse transaktsioonidena, kus algselt avatakse andmebaasi suhtes transaktsiooni objekt ning sellega viiakse läbi vajalikud päringud
db.transaction(function(tx) {
  tx.executeSql(sql:String, params:Array, result_callback:Function(tx, results), error_callback:Function(tx, error))
});

Näiteks uue tabeli loomine andmebaasi käiks nii
//CREATE TABLE my_table
tx.executeSql("CREATE TABLE my_table (id REAL UNIQUE, name TEXT)", 
  [], // No params to provide
  function(tx,result) { // results callback function
    alert('Success!');
  },
  function(tx,error) { // error callback function
    alert('Error creating table - ' + error.message);
  }
});

Andmete sisestamine käiks tavalise INSERT lausega
//INSERT ROWS TO my_table
tx.executeSql("INSERT INTO my_table (id, name) VALUES(?,?)", 
  [1,"minunimi"], // first param stands for "id" and the second for "name"
  function(tx,result) { // results callback function
    alert("Success!")
  },
  function(tx,error) { // error callback function
    alert('Error - ' + error.message);
  }
});

Ja andmete lugemine vastavalt SELECT lausega
//READ VALUES FROM my_table
tx.executeSql("SELECT * FROM my_table WHERE id=? AND name=?", 
  [1,"minunimi"], // first param stands for "id" and the second for "name"
  function(tx,result) { // results callback function
    if(result && result.rows){
      for (var i = 0; i < result.rows.length; ++i) {
        var row = result.rows.item(i);
        alert(row['name']);
      }
    }
  },
  function(tx,error) { // error callback function
    alert('Error - ' + error.message);
  }
});

Tähele tasub panna kuidas käib muutujate sisestamine SQL lausesse - selle jaoks tuleb vajalikku kohta sisestada küsimärk (?), ning selle järjekorrale vastavalt tuleb lisada SQL päringu järgmisse parameetrisse massiivi elemendiks tegelik väärtus. Nii ei pea muretsema andmete puhastamise pärast, seda teeb andmebaasi API ise.

Seda, et kui palju aplikatsiooni andmebaas mahtu kulutab ja kui palju mahtu veel alles on, saab telefonis kontrollida seadete menüüst. Settings->Safari->Databases->andmebaasi_nimi

Reeglina peaks andmebaasi suuruseks olema 5 MB. Puhtalt andmete mõttes on seda üsna palju - selle ruumi sisse saaks näiteks vabalt mahutada plain text formaadis kõik Sõrmuste isanda raamatud.

Nii, et kui siduda omavahel iPhone veebirakenduse, andmebaasi ja ühes varasemas postituses kirjeldatud graafikateegi (see töötab ka iPhone brauseris), on juba täiesti võimalik ehitada iPhone platvormile täisfunktsionaalseid aplikatsioone. Näiteks graafilisi mänge vms.

---
Täiendus: Algselt jäi mainimata kes seda brauseri andmebaasi juba kasutavad. Seda teeb näiteks Gmail, kes salvestab kasutaja viimased kirjad brauseri andmebaasi. Seega kui avada telefonis Gmail, on koheselt kirjad ees. Alles peale baasis olevate kirjade kuvamist hakkab brauser serverist kontrollima, kas vahepeal on midagi juurde tulnud.

------
Veel üks täiendus: Versioon andmebaasiühenduse loomisel peaks hetkel olema "1.0"

Kommentaare ei ole: