Android Aplikacije U Sprezi Sa Bazama Podataka

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 30

UNIVERZITET U SARAJEVU ELEKTROTEHNIKI FAKULTET

SEMINARSKI RAD ANDROID APLIKACIJE U SPREZI SA BAZAMA PODATAKA

STUDENT: AMRA JUGO BR.INDEXA: 14181

SADRAJ
SADRAJ .................................................................................................................................. 1 1. Uvod ................................................................................................................................... 2 2. Karakteristike Andorida ..................................................................................................... 4 2.1. Android arhitektura...................................................................................................... 4 2.2. Opcije smjetanja podataka ......................................................................................... 4 3. Baza podataka SQLite ........................................................................................................ 6 3.1. SQLite i aplikacija ....................................................................................................... 6 4. Rad sa SQLite bazom podataka u Andoidu ....................................................................... 6 4.1. Kreiranje baze podataka .............................................................................................. 7 4.2. Database debugging ..................................................................................................... 9 4.3. Koritenje ranije kreirane baze podataka..................................................................... 9 4.4. Pripremanje SQLite DB fajla ...................................................................................... 9 4.5. Primjeri pisanja i itanja podataka............................................................................. 10 4.5.1 Pisanje Contact klase detaljan prikaz .............................................................. 10 4.5.2 Pisanje klase za manipulaciju SQLite bazom podataka ..................................... 12 4.6. Android Log izvjetaj ................................................................................................ 21 5. Android. Neki SQLite problemi i rjeenja. ...................................................................... 23 5.1. Problem baza podataka je zakljuana Database Is Locked .................................... 23 5.1.1 Razliite konekcije a jedan SQLiteOpenHelper................................................. 24 5.1.2 Rjeenje .............................................................................................................. 24 5.2. Problem baza je zatvorena Database Is Closed ...................................................... 25 5.2.1 Nain 1 ............................................................................................................... 25 5.2.2 Nain 2 ............................................................................................................... 26 5.2.3 Nain 3 ............................................................................................................... 26 5.2.4 Nain 4 ............................................................................................................... 26 5.3. Problem pokvarene (Corrupted) baze podataka ........................................................ 26 5.4. Optimiziranje upita .................................................................................................... 27 6. Zakljuak .......................................................................................................................... 28 7. Literatura .......................................................................................................................... 29

1. Uvod
Google Android je prvi otvoreni operativni sistem za mobilne ureaje (mobilni telefoni, tableti, netbook raunari, Google TV) pokrenut od strane Google Inc. i voen od strane Open Handset Alliance - grupe koja danas broji preko 80 tehnolokih kompanija izmeu kojih se nalaze T-Mobile, HTC, Intel, Motorola, Qualcomm, i drugi, a iji je cilj ubrzati inovacije na podruju mobilnih operacijskih sistema, a samim time ponuditi krajnjim kupcima bogatije, jeftinije i bolje iskustvo koritenja. Android je modularan i prilagodljiv pa tako postoje sluajevi njegovog prenoenja (portanja) na razne ureaje kao to su itai elektronskih knjiga, mobilni telefoni, prijenosnici, te multimedijski plejeri. Android Inc. su osnovali Andy Rubin, Rich Miner, Nick Sears i Chris White u oktobru 2003. godine kako bi razvijali programe za pametne mobilne. Nakon dvije godine gotovo tajnog rada (jedino to je bilo poznato bilo je da se radi o softveru za mobitele), Google je odluio kupiti Android. Osnivai i kljuni programeri, osnaeni Googleovim programerima, na trite donose mobilnu platformu utemeljenu na linuxovom kernelu koja bi trebala biti potpuno prilagodljiva zahtjevima korisnika. 5. novembra 2007. godine, OHA (Open Handset Alliance) otkriva mobilnu platformu otvorenog koda baziranu na Linux kernelu Android. Ovo je prvo javno predstavljanje Androida kao operativnog sistema, a prvi komercijalni ureaj u koji je bio ugraen Android OS bio je T-Mobile G1, tajvanskog proizvoaa pametnih telefona HTC (poznat i pod nazivom HTC Dream). Osnivanjem ovog saveza, Android je baen u utrku sa ostalim mobilnim platformama na tritu: iOS (Apple), Windows Phone (Microsoft), Symbian (Nokia, Sony Ericsson), Palm (HP), Bada (Samsung). Od samih poetaka Android je zamiljen kao projekt otvorenog koda (open source project) te je dostupan cjelii kod pod Apache licencom. S druge strane, proizvoaima ureaja nije dozvoljeno koritenje Android zatienog imena ukoliko Google ne certificira ureaj kao kompatibilan prema Compatibility Definition Document (CDD). Takoe, ureaji moraju zadovoljavati kriterije iz ovog dokumenta kako bi dobili pristup aplikacijama zatvorenog koda poput Android Market aplikacije. Ona slui za pretraivanje i instalaciju aplikacija koje su na tritu, a ne dolaze ugraene u sami ureaj. Jedini izuzetak od politike otvorenog koda jesu verzije 3.0, 3.1 i 3.2 kodnog imena Honeycomb kako ne bi dolo do instaliranja istih na mobilni ureaj, iz razloga to je ta verzija namjenjena upotrebi na tablet raunarima. Kod verzija 3.x biti e dostupan nakon izlaska verzije Ice Cream Sandwich koja e biti mjeavina trenutne verzije za mobilne ureaje (2.3 Gingerbread) i Honeycomb verzije. Android platforma je prilagoena za upotrebu na ureajima sa veim ekranima poput pametnih telefona koji koriste 2D grafiku kartu ili 3D grafiku kartu utemeljenu na OpenGL ES 2.0 specifikacijama. Za smjetanje podataka koristi se SQLite relacijaski DBMS (sistem za upravljanje bazom podataka, eng. Database Managment System) napisan u C programskom jeziku. Karakteristike ovog softvera jesu njegova karta koja u svega 275 kB implementira veinu SQL standarda. U odnosnu na druge sisteme za upravljanje bazama, SQLite nije poseban proces ve je sastavni dio aplikacije koja pristupa bazi podataka. Iako je veina aplikacija pisana u Java programskom jeziku, na Android ureajima ne postoji Java Virtual Machine pa tako nije mogue izvravati Java byte kod. Za pokretanje Java aplikacija, Android koristi Dalvik virtualnu mainu. Android je zasnovan na jezgri Linux 2.6 napisanom u C/C++ programskom jeziku. Obzirom na otvorenost izvornog programskog koda, aplikacije putem middleware-a imaju mogunost komuniciranja i pokretanja drugih aplikacija primjerice za ostvarivanje poziva, slanje SMS poruka, pokretanja kamere i slino. Iako su C i C++ programski jezici koriteni za radno

okruje (framework), veina aplikacija pisana je u Java programskom jeziku koristei Android Software Development Kit (SDK). Postoji mogunost pisanja aplikacija i u C/C++ programskom jeziku, no tada se koristi Android Native Code Development Kit (NDK) (androidov razvoji alat kit u izvornom kodu). Ovakvim postupkom omoguuje se bolje raspolaganje resursima i koritenje kartica programa iz jezgre i radnog okruja. Ovakvim postupkom aplikacije se ubrzavaju i do 10 puta, ali pisanje samog programa je puno sloenije.

2. Karakteristike Andorida
Android ima otvoreni kod i dostupan je potpuno besplatno proizvoaima za samostalno prilagoavanje, stoga ne postoje precizno definisane hardverske ili softverske konfiguracije. Meutim, Android podrava slijedee: skladitenje za skladitenje podataka koristi se SQLite, jednostavna relaciona baza podataka. pristupanje mreama podrane su GSM/EDGE, IDEN, CDMA, EV-DO, UMTS,Bluetooth (ukljuuje A2DP i AVRCP), Wi-Fi, LTE i WiMAX. slanje poruka postoji podrka za SMS i MMS. web ita zasnovan je na WebKit otvorenom kodu, kao i na V8 JavaScript okruenju koje koristi Chrome. multimedijalna podrka. hardverska podrka akcelerometrijski senzor, kamera, digitalni kompas, senzor rastojanja i GPS. multi-touch podrka za multi-touch ekrane. multi-tasking podrka za aplikacije koje izvravaju vie zadataka istovremeno. flash podrka - Android 2.3 podrava Flash 10.1. povezivanje postoji podrka za dijeljenje internet konekcija i inih/beinih pristupnih taaka.

2.1.

Android arhitektura

Android OS je grubo podjeljen na pet sekcija i etiri osnovna sloja:

Linux jezgro Ovaj sloj sadri sve drajvere ureaja definisane na niskom nivou biblioteke Sadre sav kod koji obezbjeuje osnovne funkcije Android operativnog
sistema. Na primjer, SQLite biblioteka obezbjeuje podrku za korienje baza podataka, tako da aplikacija moe da je koristi za skladitenje podataka. WebKit biblioteka obezbjeuje funkcije koje se odnose na pregledanje web sadraja. Android runtime okruenje - Na istom nivou kao i biblioteke, Android okruenje obezbjeuje skup osnovnih bibloiteka koje omoguavaju programerima da pisu Android aplikacije korienjem Java programskog jezika. (Android aplikacije se prevode u Dalvik izvrne datoteke virtuelne maine). Dalvik je specijalizovana virtuelna maina, projektovana specijalno za Android i optimizovana za mobilne ureaje koji koriste baterije pri radu i imaju ograniene memorijske resurse i CPU (centralnu procesorsku jedinicu). radni okvir aplikacija Omoguava se korienje razliitih mogunosti Android operativnog sistema, tako da programeri mogu da ih koriste u svojim aplikacijama. aplikacije Na ovom nivou nalaze se aplikacije koje se isporuuju sa Android ureajima (kao to su Phone, Contacts, Browser i sline), kao i aplikacije koje se preuzimaju i instaliraju korienjem Android Marketa. Sve aplikacije koje samostalno kreirate nalaze se na ovom nivou. za razliite hardverske komponente svakog pojedinanog Android ureaja.

2.2.

Opcije smjetanja podataka

Android omoguava nekoliko naina da spasite trajne aplikacijske podatke. Rijeenje koje ete izabrati zavisi od vaih specifinih potreba, kao npr. Da li podaci trebaju biti privatni za vau aplikaciju ili dostupni drugim aplikacijama (i korisniku) i koliko prostora vaim podacima treba. Opcije smjetanja podataka su sljedee:

Dijeljene Preferences - Smjetanje povjerljivih osnovnih podataka u parovima keyvalue. Interno pohranjivanje podataka - Smjetanje povjerljivih podataka memoriji uraaja. Eskterno pohranjivanje podataka vanjskom mediju. - Smjetanje javnih podataka na dijeljenom

SQLite Baze podataka - Smjetanje strukturisanih podataka u privatnoj bazi. Konekcija sa mreom - Smjetanje podatana na webu na vaem mrenom serveru.

Android prua nain da i vae privatne informacije budu dostupne drugim aplikacijama, sa dobavljaem sadraja (content provider). Provajder sadraja je opcionalna komponeta koja namee kakve god vi restrikcije hoete na pisanje/itanje vaih aplikacijsk ih podataka.

3. Baza podataka SQLite


SQLite je biblioteka koja implementira jednostavnu bazu podataka. Velikim je dijelom nezavisna od drugih biblioteka i operativnom sistemu, to ju ini pogodnom za koritenje u aplikacijama koje se bez dodatnih izmjena, planiraju koristiti na razliitim raunarima sa razliitim konfiguracijama. Pisana je u programskom jeziku C te ju je mogue prevesti sa bilo kojim standardnim C prevoditeljem (eng. compiler). Programi koji ele pristupiti bazi podataka SQLite itaju i piu direktno u datoteke baze na disku. Ovakav pristup ima i prednosti i nedostataka. Prednosti su sigurno to u sluaju baze podataka SQLite nema potrebe za instalacijom, konfiguracijom, inicijalizacijom i upravljanjem dodatnim posluiteljskim procesom. Isto tako, za koritenje baze nisu potrebne administratorske ovlasti, ve svaki program koji ima pristup disku moe koristiti bazu. S druge strane, baze podataka koje koriste zasebni posluiteljski proces nude bolju zatitu od greaka u klijentu te omoguavaju lake zakljuavanje baze pa time i bolju konkurentnost. Baza podataka SQLite je transakcijska, to znai da se sve izmjene u bazi odvijaju putem transakcija. Baza osigurava ACID (eng. Atomic, Consistent, Isolated, and Durable) svojstva transakcija ak i kad se transakcija prekine usljed ruenja programa. Ddalje, SQLite je vrlo kompaktna biblioteka pa ak i s ukljuenim svim mogunostima ne zauzima puno prostora i radi dobro ak i u okruenjima s malo memorije.

3.1.

SQLite i aplikacija

SQLite je relacijski sistem za upravljanje bazama podataka utemeljen na biblioteci pisanoj u C programskom jeziku. Programski kod SQLite-a je zasnovan na public domain principu. To znai da se programski kod moe kopirati, modificirati, objavljivati i distribuirati za bilo koju komercijalnu ili nekomercijalnu svrhu. Transakcije u SQLite-u funkcioniraju po ACID principu, tj. kod transakcije podaci ostaju postojani pri padu sistema ili nestanku elektrine energije. SQLite se koristi za spremanje aplikacijskog sadraja i izmjenjivanje podataka meu aplikacijama u Android-u. Podatke iz SQLite baze podataka dobavlja i rasporeuje Androidova komponenta Content Provider, tj. dobavlja sadraja. Koritenje SQLite-a u Android-u ne zahtijeva nikakve postavke i administraciju. Relacijski model baze podataka ini vei broj tabela koje nazivamo relacijama. Relaciju ine redovi i kolone koji sadre podatke o nekoj klasi entiteta. Entitet je dio stvarnog svijeta, a opisuje se sa atributima. Skup atributa jednog entiteta je relacija. Kolona relacije je odreena nazivom atributa i njegovim doputenim vrijednostima. Redoslijed kolona u relacijskom modelu nije bitan. Atribut je element relacijskog modela koji odreuje neko svojstvo entiteta. U kreiranju baza podataka razlikujemo konceptualni, logiki i fiziki model. Konceptualni model baze podataka ima cilj opisati semantiku baze podataka. Za prikaz konceptualnog modela koristi se DSD (engl. Data Structure Diagram) dijagram koji raspolae sa grafikim zapisima o entitetima, njihovim relacijama i ogranienjima (engl. constraint) ako ih ima.

4. Rad sa SQLite bazom podataka u Andoidu


6

Android prua punu podrku za SQLite baze. Svaka baza koju kreirate e biti dostupna po imenu svakoj klasi u aplikaciji, ali ne i van aplikacije. Pretraivanje podataka i prikaz filtrirane SQLite baze podataka u Android-u se radi pomou pokazivaa (engl. cursor). Pokaziva je objekt iz klase android.database. Za slanje upita pokaziva nudi dvije opcije, rawquery i query. Kod metode rawquery korisnik sam upisuje SQL upit, a kod metode query korisnik unosi parametre za rezultat iz definisane tabele, kolone, sortiranjem i brojem redova. Rezultat upita pokaziva sprema u redove kojima korisnik pristupa po rednom broju dok god je pokaziva aktivan. Metodom cursor.close() pokaziva se deaktivira.

4.1.

Kreiranje baze podataka

Preporueni nain da se kreira nova SQLite baza je da se kreira podklasa SQLiteOpenHelper a, i prepie (override) onCreate() metod, u kojem moete izvravati SQLite komande da se kreiraju tabele. Primjer 1.:
public class DictionaryOpenHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 2; private static final String DICTIONARY_TABLE_NAME = "dictionary"; private static final String DICTIONARY_TABLE_CREATE = "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" + KEY_WORD + " TEXT, " + KEY_DEFINITION + " TEXT);"; DictionaryOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DICTIONARY_TABLE_CREATE); } }

Zatim moete dobiti instancu konstruktor koji ste definisali.

vae

SQLiteOpenHelper imlepementacije

koristei

Jedna od funkcija koje ste naslijedili od SQLiteOpenHelper je public void onCreate(SQLiteDatabase db), koja se pokree kad se DB kreira. Moete koristiit o vu funkciju da kreirate tabelu kako je pokazano u primjeru iznad. Klasa SQLiteOpenHelper implementira metode onUpgrade() za auriranje tabele

Da bi itali i pisali iz baze, pozovite getWritableDatabase() i getReadableDatabase(), respektivno. One vraaju SQLiteDatabase objekat koje predstavlja bazu i prua metode za SQLite operacije. Moete izvravati SQLite upite koristei SQLiteDatabasequery() metode. Za kompleksnije upite, kao oni koji trebaju aliase za kolumne, trebate koristiti SQLiteQueryBuilder, koji omoguava nekoliko zgodnih metoda za pravljenje upita. Npr. aplikacije koja demonstriraju kako se koristi SQLite baza u Androidu su Note Pad i Searchable Dictionary aplikacije. Jo jedan primjer za nasljeivanje SQLiteOpenHelper-a slijedi. Primjer 2.:
view source print?

public abstract class DBManager extends SQLiteOpenHelper{ private static final String DB_FILE_NAME = "test.db"; private String tableName; private String[] columns; public DBManager(Context context,String tableName, String [] columns) { super(context, DB_FILE_NAME, null, 1); this.tableName = tableName; this.columns = columns; } . . .
Nakon nasljeivanja SQLiteOpenHelper, moramo pokrenuti super konstruktor odgovarajuim parametrima. (context, DB_FILE_NAME, null, 1). 1 je DB version. U nastavku kreiramo SQLiteOpenHelper-a.
view source print?

sa

tabelu

sa

prepisivanjem

metoda

onCreate()

iz

klase

public abstract class DBManager extends SQLiteOpenHelper{ private static final String DB_FILE_NAME = "test.db"; private String tableName; private String[] columns; public DBManager(Context context,String tableName, String [] columns) {

super(context, DB_FILE_NAME, null, 1); this.tableName = tableName; this.columns = columns; } @Override public void onCreate(SQLiteDatabase db) { String sql = "create table " + tableName + " (" + BaseColumns._ID + " integer primary key autoincrement "; for (int i=0;i<columns.length; i++) { sql+=", "+columns[i]; } sql+=" ) "; db.execSQL( sql ); } . . .

4.2.

Database debugging

Android SDK ukluuje sqlite3 alat za baze koji vam omoguava da navigirate kroz sadraj tabela, izvravate SQL komande, i izvravate druge korisne funkcije nad SQLite bazama. Android ne namee nikakva ogranienja osim SQLite koncepata. Preporuuje se da se ukljui jedno autoincrement value key polje koje se moe koristiti kao jedinstveni indetifikator, da bi se pronaao podatak. Ovo nije potrebno za privatne podatke, ali ako implementirate dobavlja sadraja, morate ukljuiti jedinstveni ID koristei BaseColumns._ID konstantu. Kada je baza kreirana lako je nastaviti sa pisanjem upita. Va objekat sad sadri reference na dva druga objekta od kojih je jedan za pisanje/ brisanje a drugi za itanje.

4.3.

Koritenje ranije kreirane baze podataka

Veina Android aplikacija pretpostavlja da elite da kreirate i ispiete vau bazu tokom rada, a ne da koristite i pristupate nezavisnoj bazi, koju uitate predhodno u vau aplikaciju. Nain koji emo pokazati koristi ranije kreirani SQLite DB fajl i kopira je u direktorij sistemske baze podataka vae aplikacije tako da je SQLiteDatabase API moe otovriti i pristupiti normalno.

4.4.

Pripremanje SQLite DB fajla

Pod pretpostavkom da imate ve jednu bazu podataka kreiranu, moramo uraditi neke modifikacije na njoj. Ako nemate sqlite manager preporuujemo download opensource SQLite Database Browser-a dostupnog za Win/Linux/Mac.

Otvorite vau bazu i dodajte novu tabelu nazvanu "android_metadata", moete izvriti sljedeu komandu da to uradite: CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US') INSERT INTO "android_metadata" VALUES ('en_US') Sada se upie jedan red sa tekstom 'en_US' u "android_metadata" tabelu: Zatim ako je potrebno, preimenuje se polje id primarni klju, vae tabele u "_id" tako da Android zna gdje da povee id polje vaih tabela. Ovo moete lako uraditi sa SQLite Database Browser-om tako to ete klknuti na edit tabele dugme , zatim izabrati tabelu koju hoete da editujete, i izabrati polje koje hoete da reimenujete. Nakon reimenovanja id polja svih vaih tabela podataka u "_id" i dodavanja "android_metadata" tabele, vaa baza podataka je spremna da se koristi u Android aplikaciji.

4.5.

Primjeri pisanja i itanja podataka

Obradiemo primjer smjetanja korisnikih kontakata u SQLite bazi podataka. Koristiemo tabelu nazvanu Contacts da smjestimo korisnike podatke. Ova tabela sadri tri kolone: id (INT),name (TEXT), phone_number(TEXT). U nastavku je structura table contacts.

4.5.1 Pisanje Contact klase detaljan prikaz


Prije nego nastavite dalje treba da napiete klasu Contact sa svim metodama (getting i setting) koje su potrebne da bi jedan contact bio jedan objekt.

Contact.java
package com.androidhive.androidsqlite;

public class Contact {

//private variables int _id; String _name; String _phone_number;

10

// Empty constructor public Contact(){

} // constructor public Contact(int id, String name, String _phone_number){ this._id = id; this._name = name; this._phone_number = _phone_number; }

// constructor public Contact(String name, String _phone_number){ this._name = name; this._phone_number = _phone_number; } // getting ID public int getID(){ return this._id; }

// setting id public void setID(int id){ this._id = id; }

// getting name public String getName(){ return this._name; }

// setting name public void setName(String name){ this._name = name; }

// getting phone number public String getPhoneNumber(){

11

return this._phone_number; }

// setting phone number public void setPhoneNumber(String phone_number){ this._phone_number = phone_number; } }

4.5.2 Pisanje klase za manipulaciju SQLite bazom podataka


Potrebno je napisati klasu koja e manipulisati sa svim CRUD (Create, Read, Update and Delete) operacijama na bazi kao i ranije u ovom radu. 1. kreirajte novi projekt (new project) tako to ete kliknuti na File New Android Project. 2. Kad je projekat kreiran, kreirajte novu klasu u vaem project src (soure direktorij) direktoriju projekta i nazovite je DatabaseHandler ( desni klik na src/package New Class) 3. Sad DatabaseHandler.java treba da nasljeuje klasu SQLiteOpenHelper.
public class DatabaseHandler extends SQLiteOpenHelper {

4. nakon nasljeivanja vae klase SQLiteOpenHelper moraete prepisati preko (override) dva metoda: onCreate() i onUpgrage()

onCreate() ovo je metod gdje je potrebno napisati izjave za kreiranje tabele. Ovo se poziva kad se baza kreira. onUpgrade() ovaj metod se poziva kad se baza modifikuje kao npr. kad se mijenja struktura tabele, prave zahtjevi itd.
public class DatabaseHandler extends SQLiteOpenHelper {

// All Static variables // Database Version private static final int DATABASE_VERSION = 1;

// Database Name private static final String DATABASE_NAME = "contactsManager";

// Contacts table name private static final String TABLE_CONTACTS = "contacts";

// Contacts Table Columns names

12

private static final String KEY_ID = "id"; private static final String KEY_NAME = "name"; private static final String KEY_PH_NO = "phone_number";

public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }

// Creating Tables @Override public void onCreate(SQLiteDatabase db) { String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")"; db.execSQL(CREATE_CONTACTS_TABLE); }

// Upgrading database @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Drop older table if existed db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

// Create tables again onCreate(db); }

4.5.2.1. Sve CRUD Operacije (Create, Read, Update i Delete)


Sada je potrebno napisati metode za manipulisanje svim operacijama pisanja i itanja iz baze. Ove emo implementirati sljedee metode za ovu tabelu kontakata.
// dodavanje novog kontakta public void addContact(Contact contact) {}

// dohvatanje jednog kontakta public Contact getContact(int id) {}

// dohvatanje svih kontakata public List<Contact> getAllContacts() {}

13

// dohvatanje broja kontakata Count public int getContactsCount() {} // auriranje jednog kontakta public int updateContact(Contact contact) {}

// Brisanje jednog kontakta public void deleteContact(Contact contact) {}

4.5.2.1. Dodavanje novog podatka (Record)


Metod nazvan addContact() prihvata Contact objekat kao parametar. Moramo napraviti ContentValues parametre koristei Contact objekat. Jednom kad upiemo podatke u bazu moramo zatvoriti vezu sa bazom.

addContact()
// dodavanje novog kontakta public void addContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues(); values.put(KEY_NAME, contact.getName()); // Contact Name values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone Number

// Umetanje reda db.insert(TABLE_CONTACTS, null, values); db.close(); // Closing database connection }

4.5.2.1. itanje Redova (reda)


Sljedei metod getContact() e proitati red jednog kontakta. Prihvata id kao parametar i vraa odgovarajui red iz tabele.

getContact()
// dohvatanje jednog kontakta public Contact getContact(int id) { SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",

14

new String[] { String.valueOf(id) }, null, null, null, null); if (cursor != null) cursor.moveToFirst();

Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2)); // return contact return contact; }

getAllContacts() e vratiti sve kontakte iz baze kontakata u formatu liste klase Contact tipa. Morate napisati for petlju ako elite da preete sve kontakte.

getAllContacts()
// dohvatanje svih kontakata public List<Contact> getAllContacts() { List<Contact> contactList = new ArrayList<Contact>(); // upit Select Sve String selectQuery = "SELECT * FROM " + TABLE_CONTACTS;

SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null);

// prolazak kroz sve redove i dodavanje na spisak if (cursor.moveToFirst()) { do { Contact contact = new Contact(); contact.setID(Integer.parseInt(cursor.getString(0))); contact.setName(cursor.getString(1)); contact.setPhoneNumber(cursor.getString(2)); // Adding contact to list contactList.add(contact); } while (cursor.moveToNext()); }

// return contact list return contactList; }

getContactsCount() e vratiti ukupan broj svih kontakata na spisku SQLite database.

15

getContactsCount()
// Getting contacts Count public int getContactsCount() { String countQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(countQuery, null); cursor.close();

// return count return cursor.getCount(); }

4.5.2.1. Auriranje podataka


updateContact() e aurirati jedan kontakt u bazi. Ovaj metod prihvata objekat klase Contact kao parameter.

updateContact()
// Updating single contact public int updateContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues(); values.put(KEY_NAME, contact.getName()); values.put(KEY_PH_NO, contact.getPhoneNumber());

// updating row return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", new String[] { String.valueOf(contact.getID()) }); }

4.5.2.1. Brisanje podataka


deleteContact() e izbrisati jedan kontakt iz baze.

deleteContact()
// Deleting single contact public void deleteContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[] { String.valueOf(contact.getID()) }); db.close();

16

4.5.2.1. Cijeli predhodni kod zajedno treba da izgleda ovako:


DatabaseHandler.java
package com.androidhive.androidsqlite;

import java.util.ArrayList; import java.util.List;

import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHandler extends SQLiteOpenHelper {

// All Static variables // Database Version private static final int DATABASE_VERSION = 1;

// Database Name private static final String DATABASE_NAME = "contactsManager";

// Contacts table name private static final String TABLE_CONTACTS = "contacts";

// Contacts Table Columns names private static final String KEY_ID = "id"; private static final String KEY_NAME = "name"; private static final String KEY_PH_NO = "phone_number";

public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }

// Creating Tables @Override public void onCreate(SQLiteDatabase db) {

17

String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")"; db.execSQL(CREATE_CONTACTS_TABLE); }

// Upgrading database @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Drop older table if existed db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

// Create tables again onCreate(db); }

/** * All CRUD(Create, Read, Update, Delete) Operations */

// Adding new contact void addContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues(); values.put(KEY_NAME, contact.getName()); // Contact Name values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone

// Inserting Row db.insert(TABLE_CONTACTS, null, values); db.close(); // Closing database connection }

// Getting single contact Contact getContact(int id) { SQLiteDatabase db = this.getReadableDatabase();

18

Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, KEY_NAME, KEY_PH_NO }, KEY_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null); if (cursor != null) cursor.moveToFirst();

Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2)); // return contact return contact; }

// Getting All Contacts public List<Contact> getAllContacts() { List<Contact> contactList = new ArrayList<Contact>(); // Select All Query String selectQuery = "SELECT * FROM " + TABLE_CONTACTS;

SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null);

// looping through all rows and adding to list if (cursor.moveToFirst()) { do { Contact contact = new Contact(); contact.setID(Integer.parseInt(cursor.getString(0))); contact.setName(cursor.getString(1)); contact.setPhoneNumber(cursor.getString(2)); // Adding contact to list contactList.add(contact); } while (cursor.moveToNext()); }

// return contact list return contactList; }

// Updating single contact

19

public int updateContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues(); values.put(KEY_NAME, contact.getName()); values.put(KEY_PH_NO, contact.getPhoneNumber());

// updating row return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", new String[] { String.valueOf(contact.getID()) }); }

// Deleting single contact public void deleteContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[] { String.valueOf(contact.getID()) }); db.close(); }

// Getting contacts Count public int getContactsCount() { String countQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(countQuery, null); cursor.close();

// return count return cursor.getCount(); }

4.5.2.1. Koritenje koda:


AndroidSQLiteTutorialActivity
package com.androidhive.androidsqlite;

import java.util.List;

20

import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView;

public class AndroidSQLiteTutorialActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

DatabaseHandler db = new DatabaseHandler(this);

/** * CRUD Operations * */ // Inserting Contacts Log.d("Insert: ", "Inserting .."); db.addContact(new Contact("Ravi", "9100000000")); db.addContact(new Contact("Srinivas", "9199999999")); db.addContact(new Contact("Tommy", "9522222222")); db.addContact(new Contact("Karthik", "9533333333"));

// Reading all contacts Log.d("Reading: ", "Reading all contacts.."); List<Contact> contacts = db.getAllContacts();

for (Contact cn : contacts) { String log = "Id: "+cn.getID()+" ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber(); // Writing Contacts to log Log.d("Name: ", log); } } }

4.6.

Android Log izvjetaj

21

Va log report moete vidjeti tako to ete otii na Windows Show View Other.. Android Log Cat.

22

5. Android. Neki SQLite problemi i rjeenja.


Danas OS Android dobija na popularnosti tako to poveava broj zadataka koje korisnici mogu rijeiti odmah. Postoje zadaci koji zahtjevaju rad sa velikim koliinama podataka a za kratko vrijeme, kao naprimjer pretraivanje full teksta u bazi SQLite koja se koristi na OS Androdiu sa dodatnim paketom android.database.sqlite. Ovaj paket ipak sadri samo skup alata sa kojim se moe raditi sa bazom, a nije okruenje koje regulie implementacije pristupanja bazi. Trenutno Google ne prua neke detaljnije preporuke za rad sa bazom. U oficijelnojh dokumetaciji postoje samo dva jednostavna primjera koritenja SQLite (NotePad and SearchableDictionary) stoga programeri nalaze svoj nain za implementaciju zadataka baze, i kao rezultat postoji mnogo naina za rad koji su esto netani. Prilino je teko elaborirati pravi pristup implementaciji. Kljune teme su slaba dokumentacija i ne transparntne mogunosti u klasama android.database.sqlite paketa. Sljedei primjeri su prvi dokaz da je pravo vrijeme da se razmisli o arhitekturi: 1. Baza je zakljuana ova poruka se pojavi kad imamo vie operacija (tredova) nad jednim te istim slogom u bazi 2. Baza je zatvorena moe se pojaviti kada radite sa bazom iz razliitih dijelova programa npr. Activity i Service. 3. corrupted (pokvarena) baza pojavlju se ako je fajl baze sa grekom, koju je prouzrkovao korisnik ili neoekivan prekid snimanja podataka u bazu (telefon se ugasio, OS greka, manjak prostora, loi sektori na SD kartici itd.) 4. Slaba efikasnost u radu sa bazom moe se pojaviti zbog unutranjih mrtvih petlji, istovremenih tranzakcija, velikog broja logovanja, nedostatka automatskog procesiranja. Pogledajmo sad detaljno zato se javljaju ove poruke, mogue demonstracije takvih sluajeva, kao i metode da se rijee.

5.1.

Problem baza podataka je zakljuana Database Is Locked

Programeri se esto sreu sa problemom kako da bolje rade sa SQLiteOpenHelper-om. Obzirom da svaki dio programa moe poslati upit na nivo sa podacima (servis, widget, etc.) SQLiteOpenHelper treba da bude omoguen svuda zajedno sa Context-om. Takoe postavlja se pitanje ako vrijedi napraviti personalnu vezu izmeu svakog dijela programa i baze, hoe li se poveati brzina upita? Postoji pitanje oko istovremenog pristupanja bazi i naravno zakljuavanja pri pisanju. Prvo treba napomenuti da se zakljuavanje u SQLite radi na nivou dokumenta, to garantuje zakljuavanje promjena od razliitih tredova i konekcija. Stoga, vie tredova moe itati iz baze, ali samo jedan moe pisti. Vie o zakljuavanju u SQL-u se moe proitati na SQLite dokumentaciji, ali vie nas zanima API koji omoguava OS Android. Pisanje sa dva istovremena trenda u bazi se moe uraditi i sa jedne i sa vie razliitih konekcija poto samo jedan moe pisati u bazu u jednom trenutku, postoje dvije varijante: 1. Ako piete sa dva treda koji su u jednoj konekciji, onda jedan tred eka da drugi zavri. 2. Ako piete sa dva treda sa razliitih konkecija onda e nastupiti greka - svi vai podaci nee biti upisani i aplikacija e biti prekinuta SQLiteDatabaseLockedException.

23

Postaje jasno da palikacije trebaju uvijek imati samo jednu kopiju SQLiteOpenHelper( samo otvorena konekcija), inae SQLiteDatabaseLockedException se moe pojaviti u svakom trenutku.

5.1.1 Razliite konekcije a jedan SQLiteOpenHelper


Svi su svjesni da SQLiteOpenHelper ima dvije metode za pruanje psistupa bazi, i to getReadableDatabase() i getWritableDatabase(), da se itaju i upisuju podaci respektivno. Ipak, u veini sluajeva postoji jedna stvarna veza. esto je to jedan te isti objekt: SQLiteOpenHelper.getReadableDatabase()==SQLiteOpenHelper.getWritableDatabase() Znai da ne postiji razlika u koritenju metoda sa kojim se itaju podaci. Ipak, postoji jedna drugi nedokumentovani problem, koji je bitniji unutar klase SQLiteDatabase postoje. Petlje za pisanje na nivou objekta SQLiteDatabase i poto postoji samo jedna SQLiteDatabase za pisanje i itanje, onda je i itanje podataka takoe blokirano. Ovo je vidljivije kada postoji velika koliina podataka u transakciji. Pored unutranjih petlji SQLiteDatabase klasa ima jo jednu zanimljivu karakteristiku: ova klasa (do API 11), omoguava kreiranje transakcija samo u ekskluzivnom transakcijskom modu. Zbog ovog se mogu javiti zastoji kada se aktivno radi sa bazom. Posmatrajmo primjer takve aplikacije koja treba da skine veliku koliinu podataka (priblino. 7000 linija koje sadre BLOB- binary large object) u pozadini prvog podizanja i spasi ih u bazu podataka. Ako se podaci spase unutar transakcije, onda spavanje traje oko 45 sekundi, ali korisnik ne moe koristiti aplikaciju jer su sve upiti za itanje blokirani. Ako su podaci spaeni u malim koliinama, onda auriranje traje prilino dugo vremena (10-15 minuta) ali korisnik moe koristiiti aplikaciju bez bilo kakvih restrikcija ili nelagoda ma sa dvostrukom otricom ili brzo ili ugodno. Razlozi za takve probleme i zakljuci su pokriveni u lanku Kevin Galligana Android Sqlite Locking. Kako onda se de oduprijemo standardnom ponaanju? U novim verzijama Androida poev od API 11, Google je ve rijeio dio problema koji se tie SQLiteDatabase funkcionalnosti, jer su dodate sljedee metode: beginTransactionNonExclusive() kreira transakciju u hitnom modu. yieldIfContendedSafely() privremeno zaustavlja transakciju da bi omoguio zavravanje drugih zadataka od strane ostalih tredova. isDatabaseIntegrityOk() provjerava integritet baze

5.1.2 Rjeenje
Prvo zakljuavanje bi trebalo biti iskljueno a omogueno itanje podataka u svim situacijama. SQLiteDatabase.setLockingEnabled(false); otkazuje koritenje unutranjeg zakljuavanja upita na logikom nivou java klase (nevezano za zakljuavanje u SQLite) SQLiteDatabase.execSQL(PRAGMA read_uncommitted = true;); omoguava itanje podataka iz kea. U stvari mijenja nivo odvojenosti. Ovaj parametar bi trebalo postaviti za svaku konekciju nanovo. Ako ima vie konekcija, onda utie samo na konekcije koje trebaju ovu komandu. SQLiteDatabase.execSQL(PRAGMA synchronous=OFF); mijenja metod pisanja u bazu podataka bez sinhronizacije; kada se aktivira ova opcija, baza podataka se moe otetiti ako sistem neoekivano padne ili se iskljui struja. Kako bilo, prema SQLite dokumentaciji neke operacije se mogu izvriti 50 puta bre ako ova opcija nije aktivirana.

24

Naalost nije cijela PRAGMA podrana u Androidu npr. PRAGMA locking_mode = NORMAL i PRAGMA journal_mode = OFF i neke druge nisu podrane. I pokuaju da se pozovu PRAGMA podaci, aplikacija pada. U dokumentaciji za metod setLockingEnabled se kae da je ovaj metod preporuen za upotrebu samo u sluaju ako ste sigurni da e se sav rad sa bazom obavljati sa jednim tredom. Trebamo moi garantovati da se u jednom trenutku odvija samo jedna transakcija. Takoe, umjesto defoltnih transakcija (ekskluzivnih transakcija) treba koristiti Hitne transakcije. U starijim verzijama Androida (ispod API 11) ne postoji opcija da se kreira Hitna transacija kroz javu, kako bilo, SQLite podrava ovu funkcionalnost. Da bi se pokrenula transakcija u hitnom modu sljedei SQLite upit treba biti izvren direktno na bazi npr. kroz metod execSQL: SQLiteDatabase.execSQL(begin immediate transaction); Obzirom da je transakcija pokrenuta direktnim upitom, onda treba biti i zavrena na isti nain: SQLiteDatabase.execSQL(commit transaction); Sada je TransactionManager jedina stvar koja je ostala da se implementira , to e zapoeti i zavriti transakcije zahtjevanog tipa. Svrha TransactionManager je da garantuje da e svi upiti za izmjene (unesi, auriraj, izbri, insert, update, delete, DDL upiti) zapoeti iz istog treda.

5.2.

Problem baza je zatvorena Database Is Closed

Kada se radi sa bazom iz jednog Activity kroz SQLiteOpenHelper oito je da bazu podataka treba otvoriti zajedno sa Activity i zatvoriti zajedno sa Activity. Ali, ako nekoliko Activities rade istovremeno sa bazom, kao i Services i dio podataak je dijeljen preko Content Provider, onda se javlja pitanje: kada se veza sa bazom treba otvoriti i zatvoriti? Ako je veza otvorena i zatvorena nakon svakog upita, onda e brzina upita opadati tokom vremena, i ako se veza otvara kad aplikacija starta, i zatvara kad se gasi, nije jasno kada se aplikacija naputa (i ako servis jo radi ili provider se ne koristi ostaje samo jedan metod Application.onTerminate()). Ipak, nijedan metod nije ispravan! Veza baze podataka se moe automatski zatvoriti nakon sljedeih uslova: Ako vei broj Activities nezavisno jedna od druge otvaraju nove veze, onda moe nastati greka koja je opisana u sluaju baza je zakljuana. Ako otvorimo vezu sa bazom po startanju aplikacije, i zatvorimo sa Application.onTerminate(), po zatvaranju aplikacije, veza sa bazom moe biti zatvorena jednim drugim pozivom: Cursor.getCount() ili Cursor.onMove(). Ako paljivo pogledamo izvorni kod ovih klasa, onda moemo vidjeti da pri nekim kombinacijama i uslovima metod SQLiteDatabase.onAllReferencesReleased() e biti pozvan, to e pozvati primarni metod dbclose().

Predloeno je vie naina da se ovo rijei:

5.2.1 Nain 1
Pri svakom pozivu baze podataka treba provjeriti da li je baza otvorena ili zatvorena, i ako je otvorena, onda je treba ponovo otvoriti.
public synchronized SQLiteDatabase getReadableDatabase() { SQLiteDatabase db; try { db = super.getReadableDatabase(); } catch (SQLiteException e) {

25

Log.d(Constants.DEBUG_TAG, e.getMessage()); db = reopenDatabase(dbFile.getAbsolutePath(), null); } return db; }

Ovaj metod ima oigledni nedostatak. Ako pravimo upite u bazu pa spasimo vezu sa ve otvorenom kopijom, a onda koristimo primljenu kopiju ne pozivajui SQLiteDatabase.getReadableDatabase() onda ovaj metod nee raditi.

5.2.2 Nain 2
Mandatorno dodavanje lane reference na bazu i zadravanje dok gok je baza podataka u upotrebi SQLiteClosable.acquireReference(); Ipak, ovdje baza treba biti zatvorena sa prelimanarnim brisanjem svih manuelno kreiranih referenci. U svakom sluaju broj referenci moe postati nula, stoga je neophodno konstantno pratiti broj referenci i praviti ih kada je potrebno. Ova metoda nije jako uspjena.

5.2.3 Nain 3
Zatvaranje i otvaranje baze nakon svakog upita. Ovaj metod je nepouzdan jer je mogue kreiranje dvije nezavisne veze za pisanje i greka e se javiti. Ako se ovaj pristup koristi samo za itanje, onda greka nee nastati, ali e se znatno usporiti efikasnost aplikacije (pogotovo ako postoji veliki broj upita u bazu).

5.2.4 Nain 4
Koritenje dobavljaa sadraja da se pristupi bazi . Poeljno je da se koristi tano jedan

provajder jednostavno je za implementaciju jer se moe dodati neogranien broj jedinstvenih identifikatora resursa (Uri). Sutina je da Content Provider prati status baze podataka. A odluka, kada je vrijeme da se zatvori baza je dodijeljena OS-u izbrisae stare provajdere iz memorije i vratie ih kada to prvi put bude zatraeno.

5.3.

Problem pokvarene (Corrupted) baze podataka

Ima malo ostavljenog prostora Android telefonima, i o njemu treba voditi rauna, inae e korisnik rtvovati vau aplikaciju radi neke druge igrice. Skoro svaka aplikacija koristi bazu podataka za smjetanje podataka pa ako je baza podatak prevelika, onda je poeljno da se smjesti na SD kartici.Starije verzije (2.2 i jo starije) ne dozvoljavaju kreiranje baza podataka na SD karticama kroz standardne alate SQLiteOpenHelper-a, ali ipak ovo se moe zaobii ako se koristi AndroidConnectionSource iz ORMLite-a. Treba se imati u vidu da sve to je vidljivo korisniku se moe i obrisati. Korisnik moe obrisati ili na neki drugi nain pokvariti fajl baze podataka, moe izvaditi SD karticu iz ureaja i slino. Ipak, korisnik nije jedini koji moe pokvariti bazu podataka. Telefon je ureaj sa nepouzdanim izvorom napajanja dio podataka moe ostati nesnimljen (najbitniji ako logiranje nije aktivirano), baza podataka se moe pokvariti u toku skidanja podataka ili kad se koristi ranije isntalirana baza podataka. Ako programer nije implementirao mehanizam za povrat (restore) baze podataka, onda e Andoid kreirati bazu nanovo. Ipak, baze podataka se mogu vratiti. Najjednostavniji nain upitom se izvuku podaci iz svih dostupnih tabela i unesu u novu bazu podataka. esto je dovoljno samo izvriti komandu VACUUM ovaj metod kreira ponovo bazu i vrati maksimum podataka.

26

esto je potrebno kreirati aplikaciju sa unaprijed kreiranom bazom podataka. Za ovo se moe uzeti dostupna baza podataka i smjestiti u prazan folder, a kada se instalira aplikacija baza podataka e takoe biti kopirana na ureaj. Fajl sa bazom podataka bi bilo n ajbolje spasiti u prazan folder, jer se on moe i kompresovati. Ipak, nemogue je uzeti podatke vee od 1 Mb, stoga bazu treba razbiti u dokumente od 1 Mb to je prilino neprikladno. Vano je da bazu podataka treba uvijek praviti na emulatoru najnie podrane verzije jer ako je na Androidu 2.3 a zatim na Androidu 2.2 nastae greka pokvarena baza podataka (corrupted database) iako na verziji 2.3. i viim, baza podataka e raditi ispravno.

5.4.

Optimiziranje upita

Brzina zavravanja upita zavisi od vie faktora, ipak optimiziranje upita i strukture baze podataka su najvaniji od njih. Da bi otimizirali upite postoji mnogo standardnih metoda koje se mogu lako nai na Internetu, zato emo definisati samo SQLite optimizacijske karakteristike. Zbog kratkoe, izloiemo ih samo kao teze. Nema potrebe za pisanjem upita koji vraaju preko 1000 linija podataka veih od 1 Mb uvijek treba koristiti operatorski limit. Ako upit vraa vie od 1000 linija onda e biti izdato upozorenje na logu ili e aplikacija pasti zavisno od raspoloive memorije i ureaja. U sluaju da je potrebno prikazati dugu listu postoje dva rijeenja: a) Naprave se upiti iz dijelova a zatim se spoje koritenjem android.database.CursorJoiner. b) Implementira se auto auriranje liste na interfejsu (lista sa potvrdom download-a). Jedan upit je mnogo bri do dva odvojena, ali je spajanje ipak preferirano. Potrebno je dobro paziti da ne postoji zajedniki skup kod spajanja. Ako je bilo ta potrebno promijeniti u bazi to treba uraditi u transakciji. Ovo nee samo garantovati za integritet podataka nego e znaajno i poveati izvravanje zadataka. Stvar je u tom to se pri svakoj promjeni baze podataka, fajl sa promjenama kreira ponovo. Ako napravite 100 umetanja u bazu podataka, onda e se napraviti 100 fajlova sa promjenama i izbrisae se takoe. A ako se 100 umetanja napravi tokom transakcije, onda se fajl sa izmjenama kreira samo jednom. Ako je potrebno kreirati tabelu od ve postojeih podataka, onda treba koristiti INSERT AS SELECT (ne treba izvravati odvojene INSERT komande) to znatno poveava brzinu izvravanja. Ako ste dobili previe podataka iz fajla odjednom, i taj veliki upit se ne ponavlja esto onda je potrebno oistiti nepotrebno iz memorije SQLiteDatabase.releaseMemory(). Kako prvo treba pisati jednostavnije upite za operator Where: SELECT * FROM tablename WHERE col1 LIKE %string% AND col2 = 123456 Radi 3-4 puta sporije nego: SELECT * FROM tablename WHERE col2 = 123456 AND col1 LIKE %string% Ispravno indeksiranje tabela poveava brzinu izvravanja za 5-7 puta. Indeksiranje treba praviti za ona polja koja emo spajati i nad kojim e se praviti pretraivanje. Bolje je i kad se naznai pravac indeksiranja, npr. : CREATE INDEX index_name ON table_name (column_name ASC). Treba koristiti FTS3 (FTS3 je SQLite virtualni model za tabele koji omoguava korisniku da izvede full-text pretraivanje na nizu dokumenata) za velike tabele za pretragu, to e znatno poveati brzinu pretraivanja po tabeli. Umjesto LIKE koristite MATCH, ali budite s vjesni da MATCH po defaultu radi kao pretraga za rije a ne za dio stringa.

27

6. Zakljuak
Na kraju ovog rada moe se napraviti nekoliko konstatacija i zakljuaka. Kao prvo moemo rei da je Andorid jedna nova generacija operativnih sistema koje tek dolaze. Kao prvi u svojoj vrsti pokazao je izvanredne rezultate dosad. Greke koje ima, se polako otklanjaju, i vremenom nema sumnje da emo imati jedan vrhunski operativni sistem. Bie jako zanimljivo pratiti nove operativne sisteme koji e pokuati ii u korak sa Andoridom. Takoe u ovom radu smo vidjeli da Andorid prua punu podrku za SQLite baze. SQLite je biblioteka koja implementira jednostavnu bazu podataka. Programi koji ele pristupiti bazi podataka SQLite itaju i piu direktno u datoteke baze na disku. Ovakav pristup ima i prednosti i nedostataka. Prednosti su sigurno to u sluaju baze podataka SQLite nema potrebe za instalacijom, konfiguracijom, inicijalizacijom i upravljanjem dodatnim posluiteljskim procesom. Isto tako, za koritenje baze nisu potrebne administratorske ovlasti, ve svaki program koji ima pristup disku moe koristiti bazu. Vei dio ovog rada objanjava kako raditi sa klasama u SQLite bazama podataka te kako kosititi metode za manipulaciju podacima. Detaljno smo pokazali kako se baze, kreiraju, kako se iz njih ita, u njih pie, kako se auriraju ili briu podaci, i na taj nain pokazali da se radi o vrlo jednostavnim operacijama koje kao takve omoguavaju dalji razvoj aplikacija u Androidu. U zadnjem poglavlju su navedeni najvaniji problemi koji se javljaju pri radu sa SQLite bibliotekom u Androidu. Naalost API ima puno propusta. Da bi se rijeili neki do njih nema dostupne dokumentacije, a takoe s vremena na vrijeme tokom rada javljaju se sistemske greke. injenica je i da sa svakom novom verzijom Android API postaje fleksibilniji i razumljiviji, greke se popravljaju i dokumentacija poboljava.

28

7. Literatura
1. 2. 3. 4. 5. 6. 7. Java For Dummies, Fifth Edition (2011) - Barry Burd Java For Programmers, Second Edition - Paul Deitel i Harvey Deitel SQL All-in-One For Dummies - Second Edition, Allen G. Taylor

http://docs.oracle.com/javase/ http://developer.android.com/guide/topics/data/data-storage.html http://mobile.dzone.com/news/android-%E2%80%93-using-sqlite http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-androidapplications/ 8. http://www.enterra-inc.com/techzone/handling_sql_issues/ 9. http://www.scribd.com/doc/96041653/467-Android-4-Poglavlje-1-Osnove-AndroidProgramiranja 10. http://bib.irb.hr/datoteka/524045.Diplomski_rad_amarjanica.pdf 11. http://hr.wikipedia.org/wiki/Android_%28operacijski_sustav%29

29

You might also like