Derinlemesine Android Data Programming
By Onder Teker
()
About this ebook
çalışan, veri işlemleriyle ilgili konular anlatılmaktadır. SQLite, SQL / Room ile veritabanı geliştirme; özkaynak
ve dosyalarla çalışma açıklanmaktadır. Uzaktaki bilgisayarlarla veri iletişimi için HTTP üzerinden REST / SOAP ile Web Service çağrımı & dosya alma / gönderme konuları anlatılmaktadır. Tüm veri işlemleri için gerekli Thread & Asynch konuları da kitabın kapsamındadır.
Read more from Onder Teker
Derinlemesine Python Rating: 0 out of 5 stars0 ratingsDerinlemesine İngilizce Dilbilgisi Rating: 5 out of 5 stars5/5Derinlemesine C Fundamentals ve Functional Programming Rating: 3 out of 5 stars3/5Derinlemesine Spring Boot Web Rating: 0 out of 5 stars0 ratingsDerinlemesine Spring Boot Fundamentals Rating: 0 out of 5 stars0 ratingsDerinlemesine Python AI Natural Language Processing Rating: 0 out of 5 stars0 ratingsDerinlemesine Java Object-Oriented Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine HTML & CSS Rating: 0 out of 5 stars0 ratingsDerinlemesine SQL Rating: 0 out of 5 stars0 ratingsDerinlemesine Python Data Science Rating: 0 out of 5 stars0 ratingsDerinlemesine Python AI Machine Learning Rating: 0 out of 5 stars0 ratingsDerinlemesine Android Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine Java Desktop Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine PHP Fundamentals Web Database Services Rating: 0 out of 5 stars0 ratingsDerinlemesine Java - MVC, JSF & Primefaces Rating: 0 out of 5 stars0 ratingsDerinlemesine Python AI Computer Vision Rating: 0 out of 5 stars0 ratingsDoğrudan Database Back-End Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine Spring Boot Cloud Rating: 0 out of 5 stars0 ratingsDerinlemesine React Rating: 0 out of 5 stars0 ratingsDerinlemesine C ++ ve Object-Oriented Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine Java - ORM, JPA & Hibernate Rating: 0 out of 5 stars0 ratingsDerinlemesine NoSQL Rating: 0 out of 5 stars0 ratingsDerinlemesine JavaScript Rating: 5 out of 5 stars5/5Derinlemesine Java Web Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine JavaScript Language Rating: 0 out of 5 stars0 ratings
Related to Derinlemesine Android Data Programming
Related ebooks
Derinlemesine Android UI Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine Java - MVC, JSF & Primefaces Rating: 0 out of 5 stars0 ratingsDerinlemesine Android Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine Spring Boot Cloud Rating: 0 out of 5 stars0 ratingsDerinlemesine NoSQL Rating: 0 out of 5 stars0 ratingsDerinlemesine Java Database Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine Spring Boot Web Rating: 0 out of 5 stars0 ratingsDerinlemesine React Rating: 0 out of 5 stars0 ratingsDerinlemesine Spring Boot Fundamentals Rating: 0 out of 5 stars0 ratingsDoğrudan Java Web Enterprise Mobile Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine Java - Patterns, CDI ve Spring Rating: 0 out of 5 stars0 ratingsDerinlemesine Java - ORM, JPA & Hibernate Rating: 0 out of 5 stars0 ratingsDerinlemesine Python AI Computer Vision Rating: 0 out of 5 stars0 ratingsDerinlemesine Spring Boot Data Rating: 0 out of 5 stars0 ratingsDoğrudan Java Eclipse Rating: 0 out of 5 stars0 ratingsFlutter için Dart Programlama Rating: 0 out of 5 stars0 ratingsDerinlemesine Java - EJB, JMS ve Web Services Rating: 0 out of 5 stars0 ratingsDoğrudan Web Front-End Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine Java Desktop Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine PHP Fundamentals Web Database Services Rating: 0 out of 5 stars0 ratingsDerinlemesine C ++ ve Object-Oriented Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine JavaScript Rating: 5 out of 5 stars5/5Derinlemesine Java Web Programming Rating: 0 out of 5 stars0 ratingsDoğrudan Java Fundamentals Database Desktop Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine SQL Rating: 0 out of 5 stars0 ratingsDerinlemesine Java Object-Oriented Programming Rating: 0 out of 5 stars0 ratingsDerinlemesine HTML & CSS Rating: 0 out of 5 stars0 ratingsDoğrudan C#.NET Rating: 0 out of 5 stars0 ratingsDerinlemesine Python Rating: 0 out of 5 stars0 ratingsDerinlemesine Python Data Science Rating: 0 out of 5 stars0 ratings
Reviews for Derinlemesine Android Data Programming
0 ratings0 reviews
Book preview
Derinlemesine Android Data Programming - Onder Teker
Derinlemesine
Android
Data
Programming
SQL SQLite Room
JSON REST XML SOAP
Network Thread Socket Stream
Service SMS Phone Receiver Sender
Asset Preference Localization Permission
Önder Teker
Godoro Yayıncılık
GODORO YAYINCILIK
Yayıncı Sertifikası No: 18531
Kitabın Adı:
Derinlemesine Android Data Programming
Copyright © 2019 Godoro Yayıncılık
Kitabın Yazarı:
Önder Teker
Birinci Basım, Ağustos 2019, İstanbul
ISBN:
978-605-69525-2-4
Kapak Tasarımı ve Mizanpaj:
Önder Teker
Baskı ve Ciltleme:
NET COPY CENTER
Özel Baskı Çözümleri
İnönü Cd. Beytülmalcı Sk. No:23/A
Gümüşsuyu, Taksim 34427 İstanbul TR.
GODORO YAYINCILIK
Çiğdem 2 Sokak No:7 D:8
Kaptan H. Rıfat Çırak İş Merkezi Mecidiyeköy
Şişli / İstanbul
Telefon/Fax : (212) 213-0275
http://www.godoro.com
SQLite
SQLite Üzerine
SQL Veritabanı (SQL Database)
Veritabanı (Database)
Verilerin saklanmasını ve gerektiğinde yeniden erişilmesini sağlayan yazılımlara veritabanı (database) adı verilir. Bu yazılımların en yaygın türü ilişkisel veritabanı (relational database) diye adlandırılır. Bu tür veritabanları verileri çizelge (table) adlı yapılarda tutar. Burada ilişki sözcüğünün kullanılmasının nedeni, veritabanı düzeninde başlıca verilerin varlık (entity) adı verilen yapılarda saklanması ve bunların arasında ilişki (relation) tanımlayarak karmaşık verilerin modellenebilmesidir.
Çizelge (Table)
Veritabanlarında çizelge (table) yapısı dikeç (column) ve yataç (row) olarak düşünülür. Burada dikeç, tablonun aynı türdeki verilerinden oluşan sütunudur. Öte yandan yataç ise her bir kaydı simgeleyen satırdır. Örneğin ürün diye bir çizelge varsa bundan bir ürün kimliği, ürün adı ve satış ederi biçiminde üç dikeç bulunur. Satır ise eklenen her bir ürün anlamında gelir. Buna göre yeni bir ürün eklemek, yeni bir satır eklemek demektir. Bir satırın bir sütundaki değeri, yani bir dikeçle ile yataçın kesiştiği yere genellikle tarla (field) adı verilir. Her dikeç için bir tür (type) belirlenir. Örneğin ürün kimliği, bütün (integer); ürün adı, yazı (text) ve satış ederi de gerçek (real) türündedir. Bir yataçtaki bir tarla, ilgili dikecin tür (type) bilgisine uymalıdır. Örneğin satış ederi sütunu gerçek sayı olarak bildirildiyse oraya harf girilmez.
SQL
İlişkisel veritabanlarında verileri yazmak için SQL adı verilen dil kullanılır. Çok karmaşık olmayan bu dilde yazma ve okuma işlemlerine ilişkin bir çok buyruk (command) bulunur. Bunlardan insert (sokma), bir satır ekleme; update (güncelle), bir satırın içeriğini değiştirme; delete (sil) ise bir satırı giderme anlamına gelir. Verileri almak için select (seç) buyruğu kullanılır. Herhangi bir ölçüt bildirilmezse çizelgedeki tüm kayıtlar gelir. Ancak koşul vermek için where (şurada) biçiminde bir açarsöz bulunmaktadır. Bir tablo oluşturmak için create (yarat), tablonun yapısını değiştirmek için alter (almaştır) ve yok etmek için de drop (düşür) biçiminde buyruklar bulunmaktadır.
SQLite
İlişkisel veritabanları arasında gelişmiş bir çok ürün sayılabilir. Ancak bunların çoğu, çok özkaynak tüketmekte ve daha çok işgörücü (server) adı verilen düzeneklerde kullanılmaktadır. Bu nedenle Android gibi bilgisayarlara göre daha az gücü olan aygıtlarda kullanılmaları olanaklı değildir. Bu nedenle çok ince, az yer harcayan SQLite adlı, açık kaynaklı ürün kullanılmaktadır. Bu ürün Android aygıtlarında herhangi bir kurulum yapmadan, hazır durumda bulunmaktadır.
İçerik Sağlayıcı (Content Provider)
Android işletim düzeninde tutulan veriler ya dosya (file) ya da SQLite üzerinde saklanmaktadır. Ancak değmeler (contacts) , gündizme (calendar), telefon (phone) gibi uygulamalar ve altyapıların verileri de SQLite ile saklanmaktadır. Bunlar, olağan SQLite yapısıyla erişilebilse de veritabanlarının adının ne olduğu, nerede oldukları, tabloları adının ne olduğu gibi bilgilere erişmek için kimi özel işlemler yapılmalıdır. İşletim düzeninde kullanıcıyla ilgilere verilere erişim sağlayan yapılara içerik sağlayıcı (content provider) adı verilmektedir.
Room Direme Betikliği (Room Persistence Library)
SQLite veritabanını doğrudan kullanmak yerine, SQL dilini kullanmadan, doğrudan Java nesneleriyle yazma ve okuma yapılmasını sağlayan Room Direme Betikliği (Room Persistence Library) adlı bir betiklik bulunmaktadır. Bununla, açımlama (annotation) kullanarak nesneleri direyen (persistent) duruma olanaklıdır. Özellikle başka çevrelerde ORM konularını bilenler ve SQL ile uğraşmak istemeyenler için iyi bir almaşık oluşturabilir. Öte yandan SQL dili, yazımı uzun olsa da, çok yaygın bilinmekte; buna karşın Room betikliğinde de kendine özgü konularını öğrenme zorunluğu ortaya çıkmaktadır.
Sınıflar Üzerine
SQLiteDatabase
SQLite ile ilgili en temel sınıf SQLiteDatabase (SQLite Veritabanı) sınıfıdır. Belli bir veritabanına yazma ve okumayla ilgili tüm işlemler bu sınıfla yapılır. İki tür yöntem içerdiği söylenebilir. Bunlardan bir tanesi olağan SQL dili ile yapılanlardır. Ancak bunun dışında, hiç SQL yazmadan temel işlemleri yapabilmek için yöntemler de bulunmaktadır.
SQLiteDatabase sınıfını kullanarak; yaratma (create) veya almaştırma (alter) türündeki işlemlerde execSQL() (SQL yürüt) yöntemi kullanılabilir. Buna karşın seçme (select) gibi okuma türü işlemlerde de rawQuery() (çiğ sorgu) yöntemi kullanılır. Öte yandan, sok (insert), güncelleme (update) ve silme (delete) gibi yazma işlemlerinde sonuç beklenmiyorsa execSQL(), bekleniyorsa rawQuery() yöntemleri kullanılabilir.
SQLiteDatabase sınıfında, SQL kullanmadan temel işlemleri yürütmek için yöntemler bulunmaktadır. Örneğin insert() (sok) ve update() (güncelle) yöntemleri, tablonun adı ve işlem yapılacak verileri alarak doğrudan yazma işlemini gerçekleştirebilir. Benzerlikle, delete() (sil) yöntemi de tablonun adını ve silinecek satırının birincil açarını alarak giderme yapabilir. Olağan durumda select() (seç) yöntemiyle yapılan işlemleri query() (sorgula) adlı yöntemle yaparak, sonuçları almak olanaklıdır.
SQLiteDatabase sınıfındaki yöntemler çok sayıda yüklendirme (overload) içermezler. Genelde tek bir yöntem yapılmıştır. Bu durumda kullanımı gerekmeyen değiştirgenlere null (yok) değeri vermek gerekmektedir.
SQLiteOpenHelper
SQLiteDatabase nesnesiyle çalışırken veritabanının daha önce yaratılmış olup olmadığı, üzerinde bir değişiklik yapılıp yapılmayacağı gibi konular önemli duruma gelmektedir. Çünkü bir taşınabilir aygıt (mobile device), bir işgörücü düzenek (server machine) gibi geliştiricinin elinde olan bir aygıt değildir. Dolayısıyla veritabanının aygıtta yüklü biçimine bakmak olanaklı değildir. Başka bir deyişle veritabanının tutulduğu konum (location) belli değildir.
Bir başka sorun da sürüm (version) konusundadır. Aygıtlara daha önceki sürümler aynı zamanda yüklenmemiş olabilir. Örneğin iki aygıt 1. sürümü indirdikten sona ikinci aygıt 2. sürümü yüklemiş ikincisi yüklememiş olabilir. Bu durumda 3. sürüm yüklendiğinde birinci aygıt için iki sürüm atlatmak gerekirken ikinci aygıt için yalnızca bir sürüm atlatmak yeterli olur.
Yukarıda anlatılan sorunlara çözüm üretmek için SQLiteOpenHelper (SQLite Açma Yardımcısı) adlı bir sınıf yapılmıştır. Bu sınıf, veritabanına bir ad (name) verilince kendiliğinden yaratılır. Her yaratılışta da bir sürüm (version) verir. Sürüm ilk kez yüklendiğinde onCreate() (yaratmada) biçimindeki bir yöntem çağrılır. Ancak sürüm değişince onUpgrade() (güncellemede) adlı yöntem çağrılır. Bu yönteme, şu anda aygıtta yüklü olan eski sürüm (old version) ve şu anda uygulamanın yüklediği yeni sürüm (new version) verilir. Bu biçimde kaçıncı sürümden kaçıncıya geçildiği bilinir ve ona göre veritabanı değişiklikleri yapılır.
Açma yardımcısı sınıfının onCreate() (yaratmada) yönteminde SQL dilindeki create table (çizelge yarat) buyruğu kullanılır. Öte yandan onUpgrade() (yükseltmede) yönteminde alter (almaştır) buyruğu çalıştırılır. İkinci yöntem için bir başka yol da önce drop table (tablo düşür) ile eski tabloyu silmek ve yeniden create (yarat) buyruğunu çağırmak olabilir. Ancak bu durumda kullanıcının tüm verisi silinir, her şeye sıfırdan başlamak durumunda kalır.
ContentValues (İçerik Değerleri)
Veritabanına sokma (insert) ve güncelleme (update) yapmak için değerlerin verilmesi gerekir. ContentValues (İçerik Değerleri) nesnesi, verilecek değerleri tutar. Hiç SQL yazmadan, insert() (sok) ve update() (güncelle) biçimindeki yöntemler bu sınıf türünde nesneler alır ve yazma işlemini gerçekleştirir.
Cursor (İmleç)
Veritabanından seçme (select) buyruğuyla sonuçlar alındığında, dönen veri bir dizi ya da dizelge gibi elde edilmez. Gerçekte tüm veriler dönmez. Onun yerine, sonuçları almak için kullanılabilecek Cursor (İmleç) türünde bir nesne döner. Sonuçlar bu nesneden birer birer alınır. Çoğu kez veriler istendikçe diskten getirilir. Başka bir deyişle, dönen sonuçları içermek için değil, sonuçlara erişmek için kullanılan bir nesnedir.
SimpleCursorAdapter
Veritabanından Cursor ile alınan verileri ListView (Dizelge Görünümü) ya da GridView (Izgara Görünümü) gibi bileşenlerde göstermek için SimpleCursorAdapter (Yalın İmleç Bağdaştırıcı) adlı sınıf kullanılabilir. Bu sınıfın yaptığı görsel bileşenlerle veritabanı arasında köprü kurmaktır. Doğallıkla, geliştirici bunun yerine kendi bağdaştırıcı sınıfını da yazabilir.
Temel İşlemler
Veritabanı (Database)
Bir veritabanı ile çalışmak için öncelikle SQLiteOpenHelper (SQLite Açma Yardımcısı) sınıfından türeyen bir alt sınıf yapılır. Bu sınıfa bir yapılayıcı (constructor) eklenir ve soyut (abstract) yöntemler için ezme (override) yapılır.
Yapıcı (Constructor)
Türeyen sınıfın yapıcı (constructor) biriminde Context (Bağlam) nesnesi alınarak super (üst) yöntemiyle taban sınıfa iletilir. Üst sınıfının kurucusunu çağırırken veritabanı için bir ad (name) ve sürüm (version) verilir. Üst sınıf bir de CursorFactory (İmleç Üretimliği) nesnesi istese de null (yok) verilerek geçilebilir.
Örneğin
public class OurSqlHelper extends SQLiteOpenHelper {
public OurSqlHelper(Context context) {
super(context, "ourdb", null, 1);
}
}
biçimindeki çağrı, ourdb (veritabanımız) adında bir veritabanı oluşturur ve sürüm sayısı olarak 1 verir.
SQLiteOpenHelper sınıfı soyuttur ve onCreate() (yaratmada) ve onUpdate() (güncellemede) adlı yöntemler için ezme (override) yapılması gerekir. İlkinde tablolar yaratılmalı ikincisinde tablolar değiştirilmeli, silinmeli ya da eklenmelidir. Bu iki yönteme de SQLiteDatabase (SQLite Veritabanı) nesnesi değiştirgen olarak verilir.
Açma (Open)
Bir veritabanıyla çalışılabilmesi için öncelikle açılması gerekir. İki biçimde açmak olanaklıdır: okunabilir (readable) ve yazılabilir (writable). Bir veritabanı okunabilir olarak açıldıysa üzerinde sokma (insert), güncelleme (update) ve silme (delete) gibi işlemler yapılmaz. Bunlar yapılmak isteniyorsa okunabilir olarak açılmalıdır.
Örneğin SQLiteOpenHelper sınıfındaki getWritableDatabase() (yazılabilir veritabanını edin) yöntemiyle yazılabilir durumda açma yapılabilir:
SQLiteDatabase database = helper.getWritableDatabase();
Yalnızca okuma yapılacaksa getReadableDatabase() (okunabilir veritabanını edin) yöntemi kullanılır:
SQLiteDatabase database = helper.getReadableDatabase();
Veritabanını açma işlemleri etkinlik (activity) gibi sınıfların onCreate() (yaratmada) yönteminde yapılmalıdır.
Kapatma (Close)
Bir veritabanında işlemler yapıldıktan sonra kapatılmalıdır. Bunun için SQLiteOpenHelper sınıfındaki close() (kapat) yöntemi kullanılabilir:
helper.close();
Söz konusu yöntem etkinlik (activity) gibi sınıfların onDestroy() (yok etmede) yönteminde çağrılmalıdır.
OnCreate() (Yaratmada)
Açma yardımcısı sınıfının onCreate() (yaratmada) yönteminde SQL dilindeki create table (çizelge yarat) buyruğuyla tablo yaratılabilir. Örneğin
@Override
public void onCreate(SQLiteDatabase database) {
String create="create table ourtable( "
+" _id integer primary key autoincrement, "
+" ourname varchar(50) not null,"
+" ourvalue float)";
database.execSQL(create);
}
biçimindeki sorguda ourtable (çizelgemiz) adlı bir tablo, _id (kimlik), ourname (adım) ve ourvalue (değerim) adlı sütunlarla yaratılmaktadır. Kimlik alanı olarak ourid (kimliğim) gibi bir ad verilebilse de Android işletim düzeninde _id özel bir anlama sahiptir ve bir çok yerde işlemleri kolaylaştırır.
OnUpgrate() (Yükseltmede)
Açma yardımcısı sınıfının onUpgrade() (yükseltmede) yönteminde alter table (çizelge almaştır) buyruğuyla var olan tablolarda değişiklik yapılabilir. Ancak sınama aşamasında drop table (çizelgeyi düşür) buyruğu çağrıldıktan sonra tabloların yaratılması için onCreate() (yaratmada) yöntemi çağrılabilir. Örneğin
@Override
public void onUpgrade(
SQLiteDatabase database,
int oldVersion, int newVersion)
{
String drop="drop table if exists ourtable";
database.execSQL(drop);
onCreate(database);
}
biçimindeki düzgüde ourtable adlı çizelge düşürülmektedir.
Yükseltme yöntemi ilk aşamada çalışmaz. Yapıcıda sürüm sayısı (version number) olduğu sürece onUpgrare() yöntemi, herhangi bir değişiklik gerekmediği için çağrılmaz. Ancak yapıcı
public OurSqlHelper(Context context) {
super(context, "ourdb", null, 2);
}
biçiminde değiştirilirse yükseltme yöntemi çağrılır.
Gerçekçi bir uygulamada onUpgrate() yönteminde aşağıdaki gibi, sürüm sayılarına göre bir takım işlemler yapılması gerekir:
if (oldVersion == 5 && newVersion == 7 ){
// 5. sürümden 7. sürüme geçişin gerekli buyruklar
}
Yazma İşlemleri
Aşağıda, SQL kullanmadan sokma (insert), güncelle (update) ve sil (delete) işlemleri anlatılmaktadır.
Sokma (Insert)
Bir tabloya satır eklemek için insert() (sok) yöntemi kullanılabilir. Sokulacak değerler öncelikle ContentValues (İçerik Değerleri) sınıfına eklenir ve değiştirgen olarak yönteme iletilir. Örneğin
ContentValues values = new ContentValues();
values.put("ourname,
Adım");
values.put("ourvalue",12.34);
long id=database.insert("ourtable", null, values);
Burada ourtable adlı tablonun ourname ve ourvalue adlı sütunlarına değer verilerek sokma yapılmaktadır. Veritabanı nesnesindeki insert() yöntemi dikeç kimliği (row id) değeri döndürür.
Güncelleme (Update)
Var olan bir satırı değiştirmek için update() (güncelle) yöntemi kullanılabilir. Bu yönteme ContentValues (İçerik Değerleri) nesnesiyle yeni değerler verilir. Güncellenecek satırın dikeç kimliği (row id) değeri _id (kimlik) adıyla bildirilir. Örneğin
ContentValues values = new ContentValues();
values.put("ourname,
Yeni Adım");
values.put("ourvalue",43.21);
database.update("ourtable", values, "_id=" + 1,null);
Burada, güncellenecek satırın kimliğinin değerinin 1 olduğu varsayılmaktadır.
Silme (Delete)
Bir satırı gidermek için delete() (sil) yöntemi kullanılır. Bu yönteme değiştirgen olarak _id (kimlik) adıyla silinecek satırın kimlik değeri verilir. Örneğin
database.delete("ourtable", "_id=" + 1, null);
biçimindeki düzgü, kimliği 1 olan satırı siler.
Okuma İşlemleri
Aşağıda, SQL kullanmadan sokma (insert), güncelle (update) ve sil (delete) işlemleri anlatılmaktadır. Veritabanından değerleri okumak için query() (sorgula) yöntemi kullanılmaktadır. Sonuçlar Cursor (İmleç) nesnesi olarak döner.
Çok Sonuçlu Sorgu
Veritabanındaki query() (sorgula) yöntemine tablonun adı ve döndürülecek sütunların adlarını bildirerek sorgulama yapılır. Örneğin
String[] columns={"_id,
ourname,
ourvalue"};
Cursor cursor=database.query(
"ourtable", columns, null, null, null,null, null);
biçimindeki sorgu ourtable adlı çizelgedeki tüm satırları Cursor nesnesi olarak getirir. Verilere tek tek erişmek için aşağıdaki gibi bir düzgü yapılabilir:
while(cursor.moveToNext()){
long id=cursor.getLong(0);
String ourname=cursor.getString(1);
double ourvalue==cursor.getDouble(2);
}
Burada moveToNext() (sonrakine taşın) yöntemi her çağrılışında sonraki satıra geçer. Daha kayıt varsa true (doğru), yoksa false (yanlış) döndürür. O durumda while (sürece) döngüsünden çıkılmış olur.
İmleç nesnesindeki yöntemlerden getLong() (uzunu edin), getString() (sicimi edin) ve getDouble() (ikişeri edin) yöntemleri sıfır tabanlı (zero-based) olarak sütunların dizin (index) değeri verilen sütunun değerlerini döndürür.
Sütunlara, adıyla erişim için yöntem yoktur. Ancak dikeç dizini (column index) yerine dikeç adı (column name) verilmek istenirse getColumnName() (dikeç adını edin) yöntemi kullanılabilir. Örnek:
String ourname=cursor.getString(
cursor.getColumnIndex( "ourname" ) );
Burada yapılan, dikecin adıyla dizinini bulmak ve değeri bu dizinle elde etmektir. Eğer sütun adı yanlış yazıldığında bir kuraldışılık (exception) fırlatılması isteniyorsa getColumnIndexOrThrow() (dikeç dizinini al ya da fırlat) yöntemi aşağıdaki gibi
String ourname=cursor.getString(
cursor.getColumnIndexOrThrow ( ourname
) );
Tekli Sonuçlu Sorgu
Bir sorgunun sonucunda tek bir kayıt dönecekse, örneğin belli bir kimlik (id) değerine sahip bir kayıt döndürülecekse yine query() (sorgula) yöntemi, bu kez _id (kimlik) adıyla değer verilerek kullanılır. Örneğin
long id=123;
String[] columns={_id
,ourname
,ourvalue
};
Cursor cursor=database.query("ourtable",
columns, "_id=" + id, null, null,null, null);
biçimindeki sorgulama ourtable adlı tablodaki _id değeri 123 olan satırın columns ile bildirilen sütunlarını getirir.
Koşula uyan bir kayıt yoksa Cursor (İmleç) nesnesi null (yok) olarak gelir. Buna karşın kayıt olsa da imleç o kaydı göstermez. O yüzden moveToNext() (sonrakine taşın) yöntemiyle ilk satıra gelinmelidir. Başka bir deyişle
if (cursor != null) {
cursor.moveToFirst();
}
biçimindeki düzgü sonrasında imleç kullanılabilir duruma gelir. Sonrasında değerler olağan biçimde alınır:
String ourname=cursor.getString(1);
double ourvalue==cursor.getDouble(2)
Bağdaştırıcı (Adapter)
Veritabanından alınan sonuçlara erişmek için kullanılan Cursor sınıfının ListView (Dizelge Görünümü) ve GridView (Izgara Görünümü) gibi bileşenlerde kullanmak için SimpleCursorAdapter (Yalın İmleç Bağdaştırıcı) sınıfı kullanılır. Bu bileşenin öteki bağdaştırıcılardan ayrılığı, verileri dizi ya da dizelge gibi bir veri yapısından değil Cursor nesnesinden almasıdır. Bunun dışındaki kullanımı aynıdır. Örneğin
String[] from={
"_id,
ourname,
ourvalue"};
int[] to={
R.id.ourIdView,R.id.ournameView,R.id.ourvalueView};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
this,R.layout.our_row, cursor, from, to);
Burada from (şundan) dizisi gösterilecek sütunların adlarıdır. Öte yandan, to (şuna) dizisi değerleri gösterecek bileşenlerin kimlikleridir. Koddaki our_row ise satırın nasıl gösterileceğini bildiren serim (layout) dosyasının adıdır.
SQLite Uygulaması
Aşağıda SQLite veritabanın bir tablonun sokma (insert), güncelleme (update), silme (delete) ve seçme (select) işlemlerini gösteren bir örnek anlatılmaktadır. Veritabanı işlemleri dışında tüm kayıtları bir ListView (Dizelge Görünümü) olarak gösteren bir özet etkinliği ve her bir kaydın eklenmesini ve güncellenmesini sağlayan bir ayrıntı etkinliği bulunmaktadır. Önceki bölümlerde bir veritabanı oluşturulması ve ona erişilmesiyle ilgili işlemler anlatılmaktadır. Sonraki bölümlerde kullanıcıyla etkileşim kuran sınıflar anlatılmaktadır.
SQLiteOpenHelper
SQLiteOpenHelper (SQLite Açma Yardımcısı) sınıfını uzatan InventorySqlHelper (Sayımca SQL Yardımcı) adlı bir sınıf yazalım:
public class InventorySqlHelper extends SQLiteOpenHelper {
public InventorySqlHelper(Context context) {
super(context, "inventory", null, 1);
}
@Override
public void onCreate(SQLiteDatabase database) {
String create="create table product( " +
" _id integer primary key autoincrement, " +
" productName varchar(50) not null," +
" salesPrice float)";
database.execSQL(create);
}
@Override
public void onUpgrade(SQLiteDatabase database,
int oldVersion, int newVersion)
{
String drop=drop table if exists product
;
database.execSQL(drop);
onCreate(database);
}
}
Yukarıdaki sınıfta inventory (sayımca) adlı bir veritabanı 1 sayılı sürümle yaratılmıştır. Sınıfın onCreate() (yaratmada yönteminde) product (ürün) adlı bir çizelge create table (çizelge yarat) yöntemiyle oluşturulmaktadır. Sınıftaki onUpgrade() (yükseltmede) yönteminde ise yaratılan tablo düşürülüp yeniden yaratılması için onCreate() yöntemi çağrılmaktadır. Gerçek bir uygulamadan oldVersion (eski sürüm) ve newVersion (yeni sürüm) değerlerine bakarak tablolarda değişiklikler yapılmalıdır. Genelde alter table (çizelge almaştır) buyruğu kullanılır. Her iki yöntemde de SQL buyrukları execSQL() (SQL yürüt) yöntemiyle çağrılmaktadır.
Depo (Repository)
Veritabanına okuma ve yazma işlemleri yapan InventoryProductRepository (Sayımca Ürün Deposu) adlı bir sınıf yapalım:
public class InventoryProductRepository