Android Database SQLLite
Android Mimarisi Android İşletim sistemi, adres defteri, telefon arama, notification, 2D/3D grafik, Database, security/encryption, camera, ses, input/output, web.. gibi kütüphaneler sağlar. http://developer.android.com/images/system-architecture.jpg
SQLLite SQLite açık kaynak kodlu veritabanıdır. SQL syntax, transactions ve sorgular gibi standart ilişkili veritabanı özelliklerini destekler. SQLite, TEXT (java da String gibi), INTEGER(java da long gibi), REAL(java da double gibi) veri tiplerini destekler. Ayrıca diğer tüm tipler veritabanına kaydedilmeden önce yukarda verilen veri tiplerinden birine çevrilmelidir. SQLite, veritabanına girilen değerlerin tiplerini kontrol etmez. Yani string kolonuna integer ifade girebilirsiniz.
SQLLite SQLite her android cihazı içerisinde gömülüdür. SQLite veritabanını kullanırken veritabanı için kurulum gerektirmez. Sadece veritabanını oluştururken ve update işlemi yaparken SQL sorgusu yazılmaz. Diğer tüm işlemler (tablo oluşturma, insert,update,delete,select) SQl sorgusu ile yapılabildiğigibi, Android platformu tarafından komutla yapılır. Örn: Silme: db.delete("ogr", "yas > 10 AND yas < 20", null); Güncelleme: ContentValues newages = new ContentValues(); newages.put("yas",45); db.update("ogr,newages,"num =? OR num =?", new String[ ] {"101", "103" ); SQLite veritabanına erişim dosya sistemine erişimi de içerir. İşlemler yavaş olabilir, bu yüzden veritabanı işlemleri eş zamansız olarak çalıştırılması tavsiye edilir. Eger uygulamanız veritabanı oluşturduysa, bu veritabanına /data/data/<package_name> yolunu izleyerek ulaşılabilir.
SQLiteOpenHelper Sınıfı ve Veritabanı oluşturmak ve güncellemek Android uygulamalarda veritabanı oluşturmak ve güncellemek için SQLiteOpenHelper ın alt sınıfları kullanılır. SQLiteOpenHelper ın constructor ına (yapıcı sınıf) veritabanının ismi ve güncel database versiyonu gönderilir. public MySQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); Bu sınıfta iki tane metot override edilmelidir. metottur. oncreate() : Veritabanının oluşturan metottur. onupgrade() : Daha önceden oluşturulmuş veritabanını güncellemeye yarayan Her iki metot SQLiteDatabese nesnesi alır. SQLiteOpenHelper sınıfı veritabanı nesnesine erişmek için getreadabledatabase() ve getwritabledatabase() metotlarını sağlar. Veritabanı tablolarında primary key kullanılmalıdır. http://www.akilliyazilim.org/androiddersleri/sqlite-ve-android-temel-bilgiler.html
SQLiteOpenHelper Sınıfı ve Veritabanı oluşturmak ve güncellemek SQLiteDatabase temel SQLite Database işlemlerinin yapılmasını sağlar, insert(), update(), delete(). Ayrıca ek olarak SQL sorgularını çalıştırabilmek için execsql() metodu vardır. ContentValues nesnesi anahtar/değer tanımlamak için kullanılır. Anahtar kelimesi tablolardaki sütun isimlerini, değer ise sütun içi değerleri temsil etmektedir. Sorgular rawquery() ve query() metotlarıyla yada SQLiteQueryBuilder sınıfıyla oluşturulur. rawquery() : SQL seçme sorguları için kullanılır. query() : Özel SQL sorguları için yapılandırılmış arayüzü sağlar. SQLiteQueryBuilder ise SQLite sorgularını çalıştırmak için yardımcı olan sınıftır. http://www.akilliyazilim.org/androiddersleri/sqlite-ve-android-temel-bilgiler.html
rawquery() SQLiteDatabase db = this.getreadabledatabase(); Cursor cursor = db.rawquery("select * from ogr where num =?", new String[ ] { num ); query() return database.query(database_table, new String[] { KEY_ROWID, KEY_CATEGORY, KEY_SUMMARY, KEY_DESCRIPTION, null, null, null, null, null); query() metodu aşağıdaki parametreleri alır. Parameter Comment String dbname Sorgunun çalıştırılacağı tablo ismi. String[] columnnames Return edilecek kolon isimleri. Tüm kolonlar için null girilir. String whereclause Belli dataları seçmek için girilecek koşuldur. String[] selectionargs whereclause koşulunda? konulan dataların değeri girildiği yer. String[] groupby Seçilen satırları belli koşula göre gruplara ayırmayı sağlar. String[] having Gruba ayrılan satırları filtrelemek için kullanılır String[] orderby Seçilen satırları sıralamak için kullanılır. http://www.akilliyazilim.org/androiddersleri/sqlite-ve-android-temel-bilgiler.html
Tablo Oluşturma SQLiteDatabase db= new SQLiteDatabase(); db.execsql("create table ogr(num text, yas integer)"); //Constructure public MySQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); //SQLiteOpenHelper sınıfının implement methodları @Override public void oncreate(sqlitedatabase db) { String tablo = "CREATE TABLE ogr ( " + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "num TEXT, "+ "adsoy TEXT )"; db.execsql(tablo);
KAYIT EKLEME (INSERT) T-SQL ile CREATE TABLE ogr(id integer primary key, num text unique, adsoy text,yas integer) INSERT INTO ogr (num,adsoy,yas) VALUES( 101, Ali Can,19) INSERT INTO ogr (num,adsoy,yas) VALUES( 102, Fatma kara,22) Android SQLite ContentValues yenikayit = new ContentValues(); yenikayit.put("num", "101"); yenikayit.put("adsoy", "Ali Can"); yenikayit.put("yas", 19); db.insert("ogr", null, yenikayit ); Replace ContentValues yenikayit = new ContentValues(); yenikayit.put("num", "101"); yenikayit.put("adsoy", "Ali Can"); yenikayit.put("yas", 19); db.replace("ogr", null, yenikayit); sqlite> select * from test; 3 foo bar
KAYIT SİLME (DELETE) Normal T-SQL komutu DELETE FROM ogr WHERE yas > 10 AND yas < 20 SQLite SQLiteDatabase db = this.getwritabledatabase(); db.execsql("delete from ogr where yas > 10 AND yas < 20"); veya db.delete("ogr", "yas > 10 AND yas < 20", null); yas i 10 ile 20 arası olan kayıtları siler db.delete("ogr", "yas =? OR num =?", new String[] {"15", "101"); yas i 15 veya numarası 101 olan kayıtları siler db.delete("ogr", "yas =?2 OR num =?1", new String[] {"101", "15"); yas i 15 veya numarası 101 olan kayıtları siler
VERİ GÜNCELLEM (UPDATE) Normal SQL komutu ile UPDATE ogr SET yas = 99 WHERE num = 101 OR num = 103 SQLLite SQLiteDatabase db = this.getwritabledatabase(); db.execsql("delete from ogr where num> 10 OR num= 103 "); VEYA ContentValues newages = new ContentValues(); newages.put("yas", Integer.valueOf(99)); db.update("ogr ); newages, "num =? OR num =?", new String[ ] {"101", "103"
ContentValues ContentValues ile INSERT, REPLACE, UPDATE işlemleri yapılabilir ContentValues cvalues = new ContentValues(); cvalues.put("columnname1", value1); cvalues.put("columnname2", value2);... db.insert("tablename", null, cvalues); veya db.replace("tablename", null, cvalues); VEYA SQLiteDatabase db = this.getwritabledatabase(); db.execsql("insert INTO ogr(num,adsoy) VALUES ( 101, Ali can )
SORGU(QUERY) YAZMA Normal SQL sorgusu SELECT table1.name, sum(table2.price) FROM table1, table2 WHERE table1.supplier = table2.id AND table1.type = "spigot" GROUP BY table1.name HAVING sum(table2.price) < 50 ORDER BY table1.name ASC LIMIT 100 Android SQLLite Cursor c = db.query( og, new String[] { "num", "adsoy", "yas >?", new String[] { "50", null, // group by null, // having "num ASC ); Veya SQLiteDatabase db = this.getreadabledatabase(); Cursor c = db.rawquery("select * from ogr where yas>50 order by num ASC;", null);
Transaction db.begintransaction(); try { // sql komutları... db.settransactionsuccessful(); finally { db.endtransaction();
BAZI SqlLite metodları SQLiteDatabase db; db.execsql("sql query"); Bazı Metodlar: db.begintransaction(), db.endtransaction() db.delete("table","whereclause",args) db.deletedatabase(file) db.insert("table",null,values) db.query(...) db.rawquery("sqlquery",args) db.replace("table",null,values) db.update("table",values,"whereclause",args)
Creating a Database: The SQLiteOpenHelper Class DATABASE oluşturma public class MyHelper extends SQLiteOpenHelper { public static final String DATABASE = "OgrDb.db"; public static final int VERSION = 6; //... public KeyValHelper(Context context) { super(context, ATABASE, null, VERSION); //...
CURSORS, LOADERS, AND ADAPTERS
Cursor, sorgu sonucunu tutar ve bu sonuçlar üzerinde satır satır hareket etmeyi sağlar. CURSOR Sorgu sonucunda oluşan kayıt sayısını getcount() metodu ile öğrenebiliriz. Sorgu sonucunda elde edilen satırlar arasında movetofirst(), movetonext() metotları ile hareket edilir. Sorgunun son elementine erişilip erişilmediği isafterlast() metodu ile öğrenilir. Cursor nesnesi getstring(), metotları ile sonuçları almayı sağlar. Örneğin getlong(kolonindex), getstring(kolonindex). Cursor nesnesi ile işlemler bittiğinde close() mtodu ile kapatılır. http://www.akilliyazilim.org/androiddersleri/sqlite-ve-android-temel-bilgiler.html
CURSOR String query = "SELECT * FROM TABLO ; SQLiteDatabase db = this.getwritabledatabase(); Cursor cursor = db.rawquery(query, null); Cursor ile belirli bir kaydı elde etme SQLiteDatabase db = this.getreadabledatabase(); Cursor cursor = db.query( TABLE_ADI, // a. table COLUMNS, // b. column names " id =?", // c. selections new String[] { String.valueOf(id), // d. selections args null, // e. group by null, // f. having null, // g. order by null); // h. limit
CURSOR cursor.movetofirst() cursor.movetolast() cursor.movetoprevious() cursor.movetonext() cursor.movetoposition(int index)
CURSOR ile elde dilen verileri alma Cursor dan elde edilen bilgide önce bilgi olup olmadığına bakılır if (cursor!= null) cursor.movetofirst(); Daha sonra cursor ile tüm veri seti üzerinde hareket ederek satır satır okunur. while (cursor.movetonext()) { Integer id = getint(cursor, ididx); String key = cursor.getstring(keyidx); Aynı şey şu şekilde de yapılabilir: for (int i = 0; i < cursor.getcount(); i++) { cursor.movetoposition(i); Integer id = getint(cursor, ididx); String key = cursor.getstring(keyidx);
Cursor Cursor cursor = db.rawquery("select * FROM students"); cursor.movetofirst(); do { int id = cursor.getint(cursor.getcolumnindex("id")); String email = cursor.getstring(cursor.getcolumnindex("email"));... while (cursor.movetonext()); cursor.close(); Cursor dan elde edilen kayıtlardan bilgi elde etme getblob(index), getdouble(index), getcolumncount(), getfloat(index), getcolumnindex(name), getint(index), getcolumnname(index), getlong(index), getcount(), getstring(index),
SimpleCursorAdapter SimpleCursorAdapter( Context context, int childlayout, Cursor c, String[ ] from, int[ ] to ); Kaynak: Pro Android book, page:160
Adapters and View Binders SimpleCursorAdapter(Context context, int childlayout, Cursor c, String[] from, int[] to) context Usually the activity from which this list is visible. layout The ID of standard XML layout for a single cell in the list view. This is the target for the cursor data. cursor The source cursor from which data is obtained. Each row in this cursor corresponds to a cell in the list view and each column to a subview in the cell s layout. from An ordered list of column names. to An ordered list of IDs for corresponding subviews of the list cell layout. The content Kaynak: Enterprise Android, Wrox, page:76
Adapters and View Binders res / layout / My_row.xml <RelativeLayout> <TextView android:id="@+id/lw_num /> <TextView android:id="@+id/lw_adsoy /> <TextView android:id="@+id/lw_yas /> </RelativeLayout>
Adapters and View Binders activity_main.xml dosyasının içeriğini aşağıdaki gibi düzenleyiniz. Sadece ListView nesnesinde düzenleme yapacağız. Bunu id sini android:id="@+id/android:list" şeklindende belirleyelim <RelativeLayout.> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/android:list" /> </RelativeLayout>
Adapters and View Binders Özel layout xml dosyası res/layout/myrow.xml <RelativeLayout> <TextView android:id="@+id/lw_num /> <TextView android:id="@+id/lw_adsoy /> <TextView android:id="@+id/lw_yas /> </RelativeLayout> JAVA KODU @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); private static final String [ ] from= new String[ ] { "num", "adsoy", "yas" ; private static final int [ ] to = new int[ ] { R.id.lw_num, R.id.lw_adsoy, R.id.lw_yas ; SimpleCursorAdapter dataadapter; dataadapter =new SimpleCursorAdapter(this, R.layout.Myrow, cursor, from, to, 0 )); ListView lv = getlistview(); lv.setadapter(dataadapter);
SqlLite Manager SqlLite Explorer Professional Firefox eklentisi olarak Firefox SqlLite Manager yeterlidir. Menüden Database->New database seçeneğini tıklayın. Açılan pencerede yeni veritabanının ismini girin, sonuna sqlite uzantısı otomatik olarak eklenecektir.
Komut Satırından SqlLite işlmeleri sqlite> create table test (key integer primary key, val text); sqlite> insert into test ( val ) values ("something"); sqlite> insert into test ( val ) values ("something else"); sqlite> select * from test;
Örnek KITAP Id integer primarykey autoincerement Baslik Text Yazar Text Yukarıdaki tablo yapısını oluşturup; Ekleme, Silme Değiştirme Arama Listeleme Işlemlerini yapalım
Book Class ını oluşturalım public class Book { private int id; private String title; private String author; public Book(){ public Book(String title, String author) { super(); this.title = title; this.author = author; @Override public String tostring() { return "Book [id=" + id + ", title=" + title + ", author=" + author+ "] ; public int getid() { return id; public String gettitle() { return title; public String getauthor() { return author; public void setid(int id) { this.id=id; public void settitle(string title) { this.title= title; public void setauthor(string author) { this.author= author;
SQLLİTE için Gerekli Kütüphaneler import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqliteopenhelper;
SqlLiteOpenHelper Classı ile DATABSE oluşturma public class MySQLiteHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "BookDB ; private static final String TABLE_BOOKS = "books ; private static final String KEY_ID = "id"; private static final String KEY_TITLE = "title"; private static final String KEY_AUTHOR = "author ; private static final String[] COLUMNS = {KEY_ID,KEY_TITLE,KEY_AUTHOR; public MySQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); @Override public void oncreate(sqlitedatabase db) { String CREATE_BOOK_TABLE = "CREATE TABLE books ( " + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, "+ "author TEXT ) ; db.execsql(create_book_table); // create books table
Tablonun Yeniden Oluşturulması veya Değiştirilmesi @Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { db.execsql("drop TABLE IF EXISTS books"); this.oncreate(db);
Tabloya veri Ekleme (INSERT) public void addbook(book book){ Log.d("addBook", book.tostring()); // 1. get reference to writable DB SQLiteDatabase db = this.getwritabledatabase(); // 2. create ContentValues to add key "column"/value ContentValues values = new ContentValues(); values.put(key_title, book.gettitle()); // get title values.put(key_author, book.getauthor()); // get author // 3. insert db.insert(table_books, // table null, //nullcolumnhack values); // key/value -> keys = column names/ values = column values // 4. close db.close();
Tabloya veri Güncelleme(UPADTE) public int updatebook(book book) { // 1. get reference to writable DB SQLiteDatabase db = this.getwritabledatabase(); // 2. create ContentValues to add key "column"/value ContentValues values = new ContentValues(); values.put("title", book.gettitle()); // get title values.put("author", book.getauthor()); // get author // 3. updating row int i = db.update(table_books, //table values, // column/value KEY_ID+" =?", // selections new String[] { String.valueOf(book.getId()) ); //selection args // 4. close db.close(); return i;
Tablodan veri Silme (DELETE) public void deletebook(book book) { // 1. get reference to writable DB SQLiteDatabase db = this.getwritabledatabase(); // 2. delete db.delete(table_books, KEY_ID + " =?", new String[]{String.valueOf(book.getId())); // 3. close db.close(); Log.d("deleteBook", book.tostring());
Tablodan veri Okuma (Cursor) SQLiteDatabase db = this.getreadabledatabase(); // 2. build query Cursor cursor = db.query(table_books, // a. table COLUMNS, // b. column names " id =?", // c. selections new String[ ] { String.valueOf(id), // d. selections args null, // e. group by null, // f. having null, // g. order by null); // h. limit // 3. if we got results get the first one if (cursor!= null) cursor.movetofirst(); cursor.getstring(0);
Tablodan veri Okuma (Cursor) public Book getbook(int id){ // 1. get reference to readable DB SQLiteDatabase db = this.getreadabledatabase(); // 2. build query Cursor cursor = db.query(table_books, // a. table COLUMNS, // b. column names " id =?", // c. selections new String[] { String.valueOf(id), // d. selections args null, // e. group by null, // f. having null, // g. order by null); // h. limit // 3. if we got results get the first one if (cursor!= null) cursor.movetofirst(); // 4. build book object Book book = new Book(); book.setid(integer.parseint(cursor.getstring(0))); book.settitle(cursor.getstring(1)); book.setauthor(cursor.getstring(2)); Log.d("getBook("+id+")", book.tostring()); // 5. return book return book;
Tablodan veri Okuma (Cursor) public List<Book> getallbooks() { List<Book> books = new LinkedList<Book>(); // 1. build the query String query = "SELECT * FROM " + TABLE_BOOKS; // 2. get reference to writable DB SQLiteDatabase db = this.getwritabledatabase(); Cursor cursor = db.rawquery(query, null); // 3. go over each row, build book and add it to list Book book = null; if (cursor.movetofirst()) { do { book = new Book(); book.setid(integer.parseint(cursor.getstring(0))); book.settitle(cursor.getstring(1)); book.setauthor(cursor.getstring(2)); // Add book to books books.add(book); while (cursor.movetonext()); Log.d("getAllBooks()", books.tostring()); return books;
KUALLINMI MySQLiteHelper db = new MySQLiteHelper(this); // Ekleme Book kitap= new Book(); kitap.settitle(et.gettext().tostring()); kitap.setauthor(et1.gettext().tostring()); db.addbook(kitap); //veya db.addbook(new Book(et.getText().toString(), et1.gettext().tostring())); // get all books //List<Book> list = db.getallbooks(); // delete one book //db.deletebook(list.get(0));
KUALLINMI MySQLiteHelper db = new MySQLiteHelper(this); // get all books List<Book> list = db.getallbooks(); // Bir Kaydı okuma Book b = db.getbook(1); et.settext(b.gettitle()); et1.settext(b.getauthor());
SORU Ad soyad Telefoncep Telefonev Email Bölümü Programı Bilgilerini KAYIT, DEĞİŞTİRME, SİLME, LİSTELEME, ARAMA yapacak Android SQLLite programını yazınız