Ugrás a fő tartalomra

Android és a SQLite

SQLite egy nyílt forráskódú adatbázis. Minden android készülék alapból tartalmaz SQLite adatbázis motort.

SQLite támogatja a szabványos relációs adatbázis-funkciókat, megvalósulnak benne az SQL nyelvszintakszisú utasítások.
Az adatbázis motor kis memória igényű (kb. 250 Kbyte) ez a legnagyobb előnye.

SQLite adattípusok:
- TEXT (String Java),
- INTEGER ( Integer Java)
- REAL (mint Java).
- BLOB (mint java)

Minden más típust átalakít egyik ilyenre a háttérben.

Minden alkalmazás saját adatbázis állományt hoz létre a saját könyvtár területén:
DATA/data/APP_NAME/databases/FILENAME

Kiemelt címkék jelentése :
Kijelölt erőforrás elérési út:        DATA  [Environment.getDataDirectory() visszatérési értéke]
Alkalmazás egyedi neve:           APP_NAME
Konkrét adatbázis egyedi neve: FILENAME.

SQLite adatbázis Android-os használata nem igényel beállítási eljárást vagy extra beadást.

Adatbázis megfelelő létrehozási SQL parancsa egyből létrehozza az adatbázis példányt és az adatbázis frissítését is.

Ezután már az adatbázis elérhető és automatikusan kezeli az Android rendszer.

Az SQLite adatbázis végső soron fájlművelettel dolgozik és ez akár lassú műveleteket eredményezhet. Ezért ajánlatos az adatbázis műveletek aszinkron megvalósítását kialakítani.

A használathoz  android.database.sqlite csomagot használnunk kell a java kódban. 

Két metódusának felüldefiniálása szükséges:
-        onCreate () : Az adatbázis induló létrehozása
-        onUpgrade () : a meglévő adatbázis frissítésére szolgál. Mindig a OnCreate () metódus követi.
Ezen felüldefiniálásnál az utolsó sorban meg kell hívni a szülő szuper metódusát is.


Az android rendszerben az SQLiteOpenHelper osztály biztosítja az adatbázis elérését.
Elérés tipusai:
-        getReadableDatabase ()  : adatbázis olvasási jogú elérés
-        getWriteableDatabase ()  : adatbázis írási jogú elérés


SQL lekérdezések/parancsok végrehajtása:
-        rawQuery ()
-        query ()

Vagy SQLiteQueryBuilder osztály segítségével.


Minta 1:
Cursor cursor = getReadableDatabase().rawQuery("select * from todo where _id = ?", new String[] { id });

Minta 2:
Cursor cursor = database.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_CATEGORY, KEY_SUMMARY, KEY_DESCRIPTION },  null, null, null, null, null);


A ContentValues objektum ​​lehetővé teszi, hogy kulcs/értékek párokkal egyszerűen kezelhessük az adatbázis eredményt, ill. visszatöltsük az adatbázisba a változásokat.

A lekérdezés eredménye egy Cursor objektumban jön létre, mely egy puffer objektum, így nem kell az összes adatot a memóriába tölteni.

A kurzus objektum hasznos tulajdonságai:
-        getCount ()              : elemek száma (eredmény rekordszáma)
-        getPosition()            : aktuális pozíció eredménytömbben
-        getColumnNames() : oszlop neveket tartalmazó tömb
-        getColumnCount()   : oszlopok számát adja vissza
-        isAfterLast ()     : Elértünk az eredmény halmaz végére

A kurzus objektum hasznos metódusai:
-        moveToFirst ()  : Eredmény halmaz első rekordjára lép
-        moveToNext ()  : Eredmény halmazon végig léptető
-        move(int offset) : kurzor mozgatása +előre -vissza az aktuális pozicióhoz (relatív)
-        moveToLast()    : utolsó rekord
-        moveToPrevious()  : előző rekord
-        moveToPosition(int position)  : A konkrét sorszámú rekordra állás (abszolult)
-        close ()             : A kurzor mindig kell zárni a metódus hívással.




Create, Read, Update, Delete (CRUD) műveletek

SQLiteDatabase  db = dbOpenHelper.getWritableDatabase();  // adatbázis írásra megnyítása

ContentValues newRecord = new ContentValues();

/// beszúrás
newRecord.put("name", name);            // új adatrekord összekészítése
newRecord.put("value",value);

db.insert("tabla", null, newRecord);    // új adatok beírása a táblába

/// törlés
db.delete("mie_table", "id = "+id, null)  // rekord törlése

/// módosítás
ContentValues updateRecord = new ContentValues(); 
        updateRecord.put(„name”, table.getName());  /// összekészítés
        updateRecord.put(„value”, table.getValue()); 
  
 db.update(„mie_table”, values, "id = ?",  new String[] { String.valueOf(contact.getID()) });  // módosítás

/// INSERT OR REPLACE INTO használata

if (db != null) {
db.close();                              // adatbázis lezárása
}






SQLite minta:

SELECT table1.name||' '|| table1.value AS nev_value,
count(1) AS count
FROM table1
JOIN   table2   ON (table1.value=table2.value)
JOIN   table3   ON (table1.value=table3.value)
GROUP BY table1.name||' '|| table1.value
ORDER BY table1.name||' '|| table1.value DESC ;


Működés ellenőrzése [ADB (Android Debugging Bridge)]
adb –e shell                //  belépés a keretrendszerbe az "-e" kapcsoló emulátoros futtatást kér

////  data/data/hu.mierdekel.android.test_app/databases/mie_test.db  nevű minta adatbázis elérése
cd /data/data
mkdir hu.mierdekel.android.test_app
cd hu.mierdekel.android.test_app
mkdir databases
cd databases

sqlite3 ./ mie_test.db  /// Adatbázishoz kapcsolódás


sqlite> .help 
.help 

.bail ON|OFF Stop after hitting an error. Default OFF 

.databases List names and files of attached databases 

.dump ?TABLE? ... Dump the database in an SQL text format 

.echo ON|OFF Turn command echo on or off 

.exit Exit this program 

.explain ON|OFF Turn output mode suitable for EXPLAIN on or off. 

.header(s) ON|OFF Turn display of headers on or off 

.help Show this message 

.import FILE TABLE Import data from FILE into TABLE 

.indices TABLE Show names of all indices on TABLE 

.load FILE ?ENTRY? Load an extension library 

.mode MODE ?TABLE? Set output mode where MODE is one of: 

                         csv Comma-separated values 

                         column Left-aligned columns. (See .width) 

                         html HTML <table> code 

                         insert SQL insert statements for TABLE 

                         line One value per line 

                         list Values delimited by .separator string 

                         tabs Tab-separated values 

                         tcl TCL list elements 

.nullvalue STRING Print STRING in place of NULL values 

.output FILENAME Send output to FILENAME 

.output stdout Send output to the screen 

.prompt MAIN CONTINUE Replace the standard prompts 

.quit Exit this program 

.read FILENAME Execute SQL in FILENAME 

.schema ?TABLE? Show the CREATE statements 

.separator STRING Change separator used by output mode and .import 

.show Show the current values for various settings 

.tables ?PATTERN? List names of tables matching a LIKE pattern 

.timeout MS Try opening locked tables for MS milliseconds 

.width NUM NUM ... Set column widths for "column" mode 

sqlite> 

Megjegyzések