Veri Tabanı İşlemleri(sqlite)

Android Yerel Veritabanı İşlemleri

Andorid işletim sisteminde hemen hemen bütün bilgiler sqlite Veri Tabanı Yönetim Sistemi kullanılarak saklanmaktadır.Programcı da veritabanı işlemleri için sqlite kullanabilir.

Bir uygulamanın veri tabanı sadece kendisine özgüdür.Ve diğer uygulamalar tarafından erişim hakkı yoktur. Peki contact list gibi bir activitye diğer uygulamalar nasıl erişebilir? İşte bunun için ContentProvider denilen ayrıca bir kavram düşünülmüştür. Bu kavrama göre bir veri tabanı içerisindeki bilgiler diğer uygulamalarla paylaşılabilmektedir.

Sqlite çok basit bir veri tabanı yönetim sistemi olduğundan güvenlik bu şekilde uygulamaya özgü veritabanı dosyaları olarak ele alınmıştır.

Sqlite Database işlemlerin iki şekilde yapılır.

1- Programlama yöntemiyle Veritabanı yaratılıp işlemler yapılabilir.

2- Daha önceden yaratılmış veritabanı projeye iliştirilebilir.

Hangisinin seçileceği seneryoya göre karar verilebeilir. Programlama yöntemiyle çalışmak küçük veritabanları için uygun olsada büyük tablolarda ekstra sql cümlesi yazmak gerektirir.

1) Programlama Yöntemiyle Veritabanı Yaratma

Bu işlem için yardımcı bazı sınıflar kullanılabilir. Sınıf içierisinde birçok durum ele alınarak ilgili işlemlerler kolaylıkla halledilebilir.

Örnek Class:[Dropbox]036-DBAdapter.java

[Dropbox]036-SimpleDatabaseProgrammatically

NOTLARIM

036 SimpleDatabaseProgrammatically ne yapar?

DBAdapter.java içerisinde programlama yöntemiyle database oluşturmak için gerekli yapı ve değerler değiştirilir. Kod üstünde değişiklik yapıldı.Tablo oluşturma için DBadapter nesnesi oluşturulur. open denir ekleme yapılır close denir.

data/data//database altında yaratılır.

Bir veri kümesi okunmak isteniyorsa Cursor isimli bir sınıf kullanılmalıdır. Cursor sınıfının moveXXX metodlarıyla kayıtlar arasında dolaşılabilir. Tüm kayıtları dolaşmak için aşağıdaki gibi bir kalıp tercih edilebilir.

 private void readAllProducts()
    {
        DBAdapter db = null;
        try
        {
            db = new DBAdapter(this);
            db.open();
            Cursor cursor = db.getProducts();
            if (cursor == null)
            {
                Toast.makeText(this, "Hatalı", Toast.LENGTH_LONG).show();
                return;
            }

            if (cursor.getCount() == 0) 
            {
                Toast.makeText(this, "Kayıtlı veri yok", Toast.LENGTH_LONG).show();
                return;
            }
            cursor.moveToFirst();

            do
            {
                String name = cursor.getString(1);
                double price = cursor.getDouble(2);
                m_list.add(name + "-" + price + "TL");
            } while (cursor.moveToNext());

            cursor.close();
        }
        finally
        {
            if (db != null)
                db.close();
        }
    }

ya da

    private void readAllProducts()
    {
        DBAdapter db = null;
        try {
            db = new DBAdapter(this);
            db.open();
            db.insertProduct("laptop", 3000);
            Cursor cursor = db.getProducts();
            if (cursor == null) {
                Toast.makeText(this, "Hatalı", Toast.LENGTH_LONG).show();
                return;
            }

            if (cursor.getCount() == 0) {
                Toast.makeText(this, "Kayıtlı veri yok", Toast.LENGTH_LONG).show();
                return;
            }

            while (cursor.moveToNext()) {
                String name = cursor.getString(1);
                double price = cursor.getDouble(2);
                m_list.add(name + "-" + price + "TL");
            }

            /*
            cursor.moveToFirst();

            do {
                String name = cursor.getString(1);
                double price = cursor.getDouble(2);
                m_list.add(name + "-" + price + "TL");
            } while (cursor.moveToNext());
            */
            cursor.close();
        }
        finally {
            if (db != null)
                db.close();
        }
    }

Sınıfın moveToPosition metodu [-1 , count] aralığında konumlanabilir. burada -1 ilk kayıttan bir öncesini count ise son kayıttan bir sonrakini temsil eder.

2)Veri Tabanının Dışarıda Oluşturulup Projeye Eklenmesi

[Dropbox]037-SimpleDatabaseFromFile

Bu yöntemde veritabanı dosyası dışarıda oluşturulur ve resource 'a iliştirilir.Bu iliştirme işlemi sırasında iliştirilen veritabanı dosyasını ilgili bölüme kopyalanmalıdır.Kopyalama işlemi için aşağıdaki metodlar kullanılabilir.

Dosya kopyalama işlemi genel bir kavramdır bir çok yöntem kullanılabilir.Burada dikkat edilmesi gereken programcı özellikle öncelikle veritabanının varlığını kontrol etmelidir.Eğer etmezse varolan dosya sıfırlanacak ve veriler yok edilecektir.

    public static void copy(InputStream is, OutputStream os, int chunkSize) throws Exception
    {
        byte [] buf = new byte[chunkSize];

        int nRead;

        while ((nRead = is.read(buf)) > 0)
            os.write(buf, 0, nRead);
    }

    public static void copyFileIfNotExists(File src, File dest, int chunkSize) throws Exception
    {
        if (dest.exists())
            return;
        copyFile(src, dest, chunkSize);
    }

    public static void copyFile(File src, File dest, int chunkSize) throws Exception
    {
        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            fis = new FileInputStream(src);
            fos = new FileOutputStream(dest);
            copy(fis, fos, chunkSize);
        }
        catch (Exception ex) {
            throw  ex;
        }
        finally {
            if (fis != null)
                fis.close();
            if (fos != null)
                fos.close();
        }
    }

NOTLARIM

037-SimpleDatabaseFromFile ne yapar?

Hazırlanan db dosyası res/raw dizinine atılır.raw klasörü yoksa yaratılır.

Program Android cihaza kurulduğunda raw içerisine atılan dosya apk'nın dexi içerisinde kalacağı için bu dosyanın sandbox'a taşınması gerekir. Taşıma işlemini yukarı verilen copyXXX metodları ile yapıyoruz.

Db'den okurken ORM mantğı kullanıldı.Okunan datalar nesneye çevrildi.

Verilen database'e uygun sınıfı oluşturan generator sınıf yazılabilir. Örneğin : Databasede product tablosunda id name price elemanları varsa bunların consturctor'ını getter'ını setter'ını instert , update , add , getall metodlarının oldugu java dosyasını txt dosyaya yazar gibi yazan program yazılabilir. Genel olarak bu yapı hibernate tarafından yapılıyor.

26 Mart

Veri tabanı dosyası kopyaladıktan sonra yine dosya üzerinde işlem yapabilmek için bir adapter sınıf kullanilabilir.Bu adaptör sınıfta dikkat edilmesi gereken onCreate metodunda (daha önceki örnek için kodla tablo oluşturma kodunun)tablo yaratma kodunun çalıştırılmamasıdır.Çünkü zaten taboloların yaratılması projenin dışında yapılmış ve gerek kalmamıştır.

Bu adapter sınıfı yazılırken veritabanı üzerindeki tabloya ilişkin bir sınıf karşılık getirilmelidir. Böyle bir yöntem programcının işini oldukça kolaylaştırır.([ORM])

SINIF ÇALIŞMASI

032-MyMemo Uygulamasını veritabanı kullanacak şekilde sqlite ile yazınız.