Bir uygulama geliştirirken verilerin saklanması ihtiyacı doğmakta ve verilerin uygulamadan ayrı bir yapı olarak durması maksadıyla veritabını kullanılmaktadır. Android bir uygulama geliştirirken, aynı nedenden dolayı verilerin saklanması ihtiyacınız olacaktır. Micro device için uygulama geliştirmek, desktop bir bilgisayar için uygulama geliştirmekten daha zordur. Memory ve harddisk’inizin kısıtlı olması, işlemcinin gücü, multitask uygulama geliştirme sıkıntısı başlıcalarındandır. Android de ise yerleşik sqlite veritabanının yer alması ise Android’e önemli bir artı sunmaktadır.
Sqlite, oldukça önemli projelerde kullanılmış (Firefox,Skype, Mcfee, iPhone,…) ve de oldukçe iyi test edilmiş bir veritabanıdır. 4K stack ve 100K ise heap için yeterlidir. Android içinde ise gelen sqlite, bir android uygulamasının ihtiyac duyduğu veritabanı işlemlerini karşılayacak düzeydedir.
Bu giriş bilgilerinden sonra örnek bir uygulama geliştirelim. Uygulamamız, ad, soyad ve telefon numarası kayıt edeceğimiz bir “customer” tablosu olsun. Linux ‘ta sqliteman gibi bir uygulama ile veritabanınızı oluştururun. Örneğimizde kullanacağımız tablonun scripti şu şekildedir:
CREATE TABLE "Customer" ( "Id" INTEGER PRIMARY KEY, "Firstname" TEXT, "Lastname" TEXT, "PhoneNumber" TEXT );
Daha sonra ise IDE nizde bir android uygulaması açınız(Android le Uygulama Geliştirme yazısından faydalanabilirsiniz). Ben daha eski telefonlarda kullanılabilmesi için 1.6 uygulması actım. Daha sonra ise droiddraw ana ekran tasarlıyoruz.
Veritabanı ilk acıldığında tablonun create edilmesi için create script i kod içine almamız gerekir. Aynı şekilde örneğimizde compiled statement kullanıyoruz. Şu anda sadece insert ve getAll metodunu implemente ettik.
public class DbHelper {
private static final String DATABASE_NAME = "rayyildiz_sample.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "Customer";
private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + " ( "
+ " \"Id\" INTEGER PRIMARY KEY,"
+ " \"Firstname\" TEXT,"
+ " \"Lastname\" TEXT,"
+ " \"PhoneNumber\" TEXT" + ")";
private static final String TABLE_INSERT = "INSERT INTO " + TABLE_NAME + "(Firstname,Lastname,PhoneNumber) VALUES (?,?,?)";
private Context context;
private SQLiteDatabase database;
private SQLiteStatement insertSQLiteStatement;
public DbHelper(Context context) {
this.context = context;
DbOpenHelper dbOpenHelper = new DbOpenHelper(context);
database = dbOpenHelper.getWritableDatabase();
insertSQLiteStatement = database.compileStatement(TABLE_INSERT);
}
public long insertCustomer(Customer customer) {
if (customer == null) {
return -1;
}
insertSQLiteStatement.bindString(1, customer.getFirstname());
insertSQLiteStatement.bindString(2, customer.getLastname());
insertSQLiteStatement.bindString(3, customer.getPhoneNumber());
return insertSQLiteStatement.executeInsert();
}
public List getAllCustomer() {
List customers = new ArrayList();
Cursor cursor = database.query(TABLE_NAME, new String[]{"id,Firstname,Lastname,PhoneNumber"}, null, null, null, null, "id desc");
if (cursor.moveToFirst()) {
do {
Customer c = new Customer();
c.setId(cursor.getInt(0));
c.setFirstname(cursor.getString(1));
c.setLastname(cursor.getString(2));
c.setPhoneNumber(cursor.getString(3));
customers.add(c);
} while (cursor.moveToNext());
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
return customers;
}
private static class DbOpenHelper extends SQLiteOpenHelper {
public DbOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
}
Bu ise Customer nesnesi
public class Customer {
private int id;
private String firstname;
private String lastname;
private String phoneNumber;
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
İki tane Aktivity ekleyelim birisi MainActivity, diğeri ise Customer bilgilerini giriş yapabileceğimiz Activity olsun.
Bunlardan AddCustomerActivity şu şekilde:
public class AddCustomerActivity extends Activity {
public final static int SUCCESS_RETURN_CODE = 1;
private DbHelper m_db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.insert);
m_db = new DbHelper(this);
Button saveButton = (Button) findViewById(R.id.btnSave);
final EditText textFirstname = (EditText) findViewById(R.id.textFirstname);
final EditText textLastname = (EditText) findViewById(R.id.textLastname);
final EditText textPhoneNumber = (EditText) findViewById(R.id.textPhoneNumber);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
Customer c = new Customer();
c.setFirstname(textFirstname.getText().toString());
c.setLastname(textLastname.getText().toString());
c.setPhoneNumber(textPhoneNumber.getText().toString());
m_db.insertCustomer(c);
setResult(SUCCESS_RETURN_CODE, intent);
finish();
}
});
}
}
Ve Main Activity şu şekildedir
public class MainActivity extends Activity {
protected static final int SUB_ACTIVITY_REQUEST_CODE = 100;
private ProgressDialog m_ProgressDialog = null;
private ArrayList m_customers = null;
private DataAdapter m_adapter;
private Runnable viewData;
DbHelper m_db;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// ToDo add your GUI initialization code here
setContentView(R.layout.main);
m_db = new DbHelper(this);
// initialize process
m_customers = new ArrayList();
this.m_adapter = new DataAdapter(this, R.layout.row, m_customers);
setListAdapter(this.m_adapter);
Button refreshButton = (Button)findViewById(R.id.btnRefresh);
refreshButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
refresh();
}
});
Button addButton = (Button) findViewById(R.id.btnAdd);
addButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v
) {
Intent i = new Intent(MainActivity.this,AddCustomerActivity.class);
startActivityForResult(i, SUB_ACTIVITY_REQUEST_CODE);
//startActivity(i);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SUB_ACTIVITY_REQUEST_CODE) {
refresh();
}
}
private void setListAdapter(DataAdapter m_adapter) {
ListView lw = (ListView) findViewById(R.id.listCustomer);
if (lw != null) {
lw.setAdapter(m_adapter);
}
}
private void insert(Customer c){
m_db.insertCustomer(c);
}
private void refresh(){
WorkerThread thread = new WorkerThread();
//Thread thread = new Thread(null, viewData, "MagentoBackground");
thread.start();
m_ProgressDialog = ProgressDialog.show(MainActivity.this,
"Please wait...", "Resfreshing data ...", true);
}
private class WorkerThread extends Thread {
@Override
public void run() {
getCustomers();
}
}
private Runnable returnRes = new Runnable() {
@Override
public void run() {
if (m_customers != null && m_customers.size() > 0) {
m_adapter.clear();
m_adapter.notifyDataSetChanged();
for (int i = 0; i < m_customers.size(); i++) {
m_adapter.add(m_customers.get(i));
}
}
m_ProgressDialog.dismiss();
m_adapter.notifyDataSetChanged();
}
};
private void getCustomers() {
try {
m_customers = new ArrayList();
m_customers = (ArrayList) m_db.getAllCustomer();
//Thread.sleep(2000);
} catch (Exception e) {
Log.e("BACKGROUND_PROC", e.getMessage());
}
runOnUiThread(returnRes);
}
public class DataAdapter extends ArrayAdapter{
private ArrayList items;
public DataAdapter(Context context, int textViewResourceId, ArrayList items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
Customer o = items.get(position);
if (o != null) {
TextView tt = (TextView) v.findViewById(R.id.listLabeltext);
if (tt != null) {
tt.setText(o.getId() +" : " + o.getFirstname() + " " + o.getLastname() + "("+ o.getPhoneNumber() + ")");
}
}
return v;
}
}
}
Örnek uygulamamızın ekran görüntüleri
Uygulamanın kaynak kodunu ise google code üzerinden indirebilirsiniz.



Furkan
20/02/2011 at 18:14
Acaba bu projenizi nasıl import edebiliriz eclipste?
erhan
22/04/2011 at 11:05
furkan klasörün içini kopyala çalışmak ta olduğun bir klasörün içini workspace de boşalt …
Hayrettin Papaz
27/10/2011 at 11:48
kodları toplu halde indirme zip dosyası lütfen
rayyildiz
27/10/2011 at 14:49
Bu yazdığım ornek uygulamaları nbase adında birlestirip http://code.google.com/p/nbase/ olarak paylaşmıştım. Oradan ulaşabilirsiniz.
Not: mail adresini doğru yazarsanız, iletişim daha kolay olur. oradan cevap yazmıştım, ulaşmadı.
Osman
12/01/2012 at 03:55
Projenin kodlarına ulaşamadım acaba günceller misiniz?
rayyildiz
16/01/2012 at 10:35
Projenin kaynak kodlarına http://code.google.com/p/nbase/ dan erişebilrisiniz.
Ekrem hacibektaşoğlu
16/01/2012 at 12:46
bende bu projenin kodlarına ulaşamadım
rayyildiz
16/01/2012 at 13:25
Projeyi github dan google code üzerine taşıdığım için link eskisi kalmış. Buraya tıklayarak projeyi indirebilirisiniz.
Ekrem hacibektaşoğlu
16/01/2012 at 17:22
cevap için teşekkürler
bir soru sormak istiyorum bu uygulama da olabilir veri tabanına kayıt eklerken girişin yapıldığı saati veritabına nasıl kaydedebilirz
rayyildiz
18/01/2012 at 09:58
SQLite date tipini desteklemez(bilgi). Onun yerine Integer türünde bir değer tutmanı tafsiye ederim. Bu durumda yazıdaki insertSQLiteStatement ta bindLong() metodunu kullanabilirsiniz.
Geri dönüş için ise şu şekilde kullanabilirsiniz.
createdDate = new Date(cursor.getLong(CREATED_DATE_COL_INDEX));ekrem
19/01/2012 at 15:07
cevabınız için teşekkür ederim
tarih ve saat saat bilgisini ayrı kolonlarda tutmak istiyorum
bu değerleri nasıl integer’e cevirebiliriz
selamlar
ekrem
19/01/2012 at 15:17
gali ba cevabı nette buldum ama işime yararmı (stackoverflow)
http://stackoverflow.com/questions/4674174/convert-integer-dates-times-to-unix-timestamp-in-java