Android Programlama Dersleri(41,42,43,44)

İsimli konu WH 'Android' kategorisinde, YλяCλη üyesi tarafından 25 Aralık 2016 tarihinde yazılmıştır. Android Programlama Dersleri(41,42,43,44) hakkında bilgi ve tartışmalar.

  1. YλяCλη

    YλяCλη Yönetici

    Android Programlama Ders 41: SQLite’ta Kullanılan İşlemleri İnceliyoruz


    [​IMG]
    Android Programlama Ders 41′de veri tabanı kullanarak SQLite’ta kullanılan temel işlemleri inceleceğiz.
    Veri tabanın işleminin (Transaction) ne olduğunu hakkında konuşalım. İşlemin amacı veriyle çalıştığımız zaman “ya tüm ya hiç” prensipleri taşıyor. Mesela veri tabanına bir veri paketi kaydetmek gerekiyor. Veri ya tüm kaydedilecek ya da hiç kaydedilmeyecek. Eğer verilerin yarısı kaydedilmişse, kaydedilen verilerin iptal edilmesi söz konusu olacaktır. Bu imkanı bize SQLite transaction (işlem) sunuyor.

    Konuyu daha iyi anlamak için basit bir uygulamayı oluşturalım.

    Projeyi oluşturalım:

    • Project name: P0041_SQLiteTransaction
    • Build Target: Android 4.2
    • Application name: SQLiteTransaction
    • Package name: tr.example.sqlitetransaction
    • Create Activity: MainActivity
    Bu proje için ekranı kullanmayacağız. Bu yüzden direkt MainActivity.java’yı oluşturuyoruz.

    MainActivity.java:

    Kod:
    import android.app.Activity;
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.os.Bundle;
    import android.util.Log;
    
    public class MainActivity extends Activity {
    
      final String LOG_TAG = "myLogs";
    
      DBHelper dbh;
      SQLiteDatabase db;
    
      /** Called when the activity is first created. */
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(LOG_TAG, "--- onCreate Activity ---");
        dbh = new DBHelper(this);
        myActions();
      }
    
      void myActions() {
            try {
              db = dbh.getWritableDatabase();
              delete(db, "mytable");
    
              db.beginTransaction();
              insert(db, "mytable", "val1");
    
              Log.d(LOG_TAG, "create DBHelper");
              DBHelper dbh2 = new DBHelper(this);
              Log.d(LOG_TAG, "get db");
              SQLiteDatabase db2 = dbh2.getWritableDatabase();
              read(db2, "mytable");
              dbh2.close();
    
              db.setTransactionSuccessful();
              db.endTransaction();
    
              read(db, "mytable");
              dbh.close();
    
            } catch (Exception ex) {
              Log.d(LOG_TAG, ex.getClass() + " error: " + ex.getMessage());
            }
          }
    
    
      void insert(SQLiteDatabase db, String table, String value) {
        Log.d(LOG_TAG, "Insert in table " + table + " value = " + value);
        ContentValues cv = new ContentValues();
        cv.put("val", value);
        db.insert(table, null, cv);
      }
    
      void read(SQLiteDatabase db, String table) {
        Log.d(LOG_TAG, "Read table " + table);
        Cursor c = db.query(table, null, null, null, null, null, null);
        if (c != null) {
          Log.d(LOG_TAG, "Records count = " + c.getCount());
          if (c.moveToFirst()) {
            do {
              Log.d(LOG_TAG, c.getString(c.getColumnIndex("val")));
            } while (c.moveToNext());
          }
          c.close();
        }
      }
    
      void delete(SQLiteDatabase db, String table) {
        Log.d(LOG_TAG, "Delete all from table " + table);
        db.delete(table, null, null);
      }
    
      class DBHelper extends SQLiteOpenHelper {
    
        public DBHelper(Context context) {
          super(context, "myDB", null, 1);
        }
    
        public void onCreate(SQLiteDatabase db) {
          Log.d(LOG_TAG, "--- onCreate database ---");
    
          db.execSQL("create table mytable ("
              + "id integer primary key autoincrement,"
              + "val text"
              + ");");
        }
    
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
      }
    
    }
    Kodu inceleğelim. myAction metodunda insert (Yapıştır), read (Oku) ve delete (Sil) işlemleri birleştirdim. Metodunda veri tabanına bağlıyoruz, tabloda (mytable) verileri siliniyoruz ve val1 satırı yapıştırıyoruz. Sonraki aşamada bildirime tablodan kayıtları yazdırıyoruz ve bağlantıyı kapatıyoruz.

    Kaydedelim ve çalıştıralım.

    Bildirime bakalım:

    — ONCREATE ACTİVİTY —
    — ONCREATE DATABASE —
    DELETE ALL FROM TABLE MYTABLE
    INSERT İN TABLE MYTABLE VALUE = VAL1
    READ TABLE MYTABLE
    RECORDS COUNT = 1
    VAL1


    Herşey doğru kaydını başarıyla yapıştırdık ve bildirime yazdırdık. Şimdi işlem (Transaction) kullanmayı deneyelim. myAction metodu değiştirelim:

    Kod:
    void myActions() {
         db = dbh.getWritableDatabase();
         delete(db, "mytable");
         db.beginTransaction();
         insert(db, "mytable", "val1");
         db.endTransaction();
         insert(db, "mytable", "val2");
         read(db, "mytable");
         dbh.close();
    }
    Veri tabanına bağlanıyoruz, tabloyu temizliyoruz, beginTransaction metodu kullanarak işlemi (Transaction) başlatıyoruz, val1 yapıştırıyoruz ve endTransaction yardımıyla işlemi kapatıyoruz. Sonraki aşamada val2 kaydını yapıştırıyoruz, bildirime yazdırıyoruz ve bağlantıyı kapatıyoruz. Kaydedelim ve çalıştıralım. Bildirime bakalım:

    — ONCREATE ACTİVİTY —
    DELETE ALL FROM TABLE MYTABLE
    INSERT İN TABLE MYTABLE VALUE = VAL1
    INSERT İN TABLE MYTABLE VALUE = VAL2
    READ TABLE MYTABLE
    RECORDS COUNT = 1
    VAL2


    Bildirimden görüyoruz ki tabloda sadece ikinci kayıt mevcut. Bunun sebebi, işlemin başarıyla kapatılması (setTransactionSuccessful) metodunu kullanmadık. myAction metodu değiştirelim:

    Kod:
    void myActions() {
         db = dbh.getWritableDatabase();
         delete(db, "mytable");
         db.beginTransaction();
         insert(db, "mytable", "val1");
         db.setTransactionSuccessful();
         insert(db, "mytable", "val2");
         db.endTransaction();
         insert(db, "mytable", "val3");
         read(db, "mytable");
         dbh.close();
       }
    Aynı şekilde veri tabanına bağlanıyoruz, tabloyu temizliyoruz ve val1 yapıştırıyoruz setTransactionSuccessful metoduyla işlemin başarılı olduğunu belirliyoruz, val2 kaydı yapıştırıyoruz, işlemi kapatıyoruz, val3 kayıdı yapıştırıyoruz ve read metodu kullanarak bildirime içindekileri yazdırıyoruz. Bağlantıyı kapatıyoruz (dbh.close()). Kaydedelim ve bildirime bakalım:

    — ONCREATE ACTİVİTY —
    DELETE ALL FROM TABLE MYTABLE
    INSERT İN TABLE MYTABLE VALUE = VAL1
    INSERT İN TABLE MYTABLE VALUE = VAL2
    INSERT İN TABLE MYTABLE VALUE = VAL3
    READ TABLE MYTABLE
    RECORDS COUNT = 3
    VAL1
    VAL2
    VAL3


    Tüm kayıtları başarıyla yapıştırdık. Dikkat ederseniz val2setTransactionSuccessful metodundan sonra yapıştırdık. Tavsiye edilen yöntem kayıtları setTransaction Succesful metodundan önce yapıştırmak.

    İşlem (Transaction) başladığında veri tabanı bağlantısını bloke ediyor. Örnekte işlemi gerçekleşince veri tabanına yeni bağlantı kurmayı deneyelim. myAction metodu değiştirelim:

    Kod:
    void myActions() {
         try {
           db = dbh.getWritableDatabase();
           delete(db, "mytable");
           db.beginTransaction();
           insert(db, "mytable", "val1");
           Log.d(LOG_TAG, "create DBHelper");
           DBHelper dbh2 = new DBHelper(this);
           Log.d(LOG_TAG, "get db");
           SQLiteDatabase db2 = dbh2.getWritableDatabase();
           read(db2, "mytable");
           dbh2.close();
           db.setTransactionSuccessful();
           db.endTransaction();
           read(db, "mytable");
           dbh.close();
         } catch (Exception ex) {
           Log.d(LOG_TAG, ex.getClass() + " error: " + ex.getMessage());
         }
      }
    Veri tabanına bağlanıyoruz, tabloyu temizliyoruz, işlemi başlatıyoruz, kayıdı yapıştırıyoruz. Sonraki aşamada yeni bağlantıyı oluşturuyoruz. İkinci bağlantıyı (db2) kullanarak mytable tablosundakileri okuyoruz. İkinci bağlantıyı kapatıyoruz, işlemi kapatıyoruz, birinci bağlantıyla mytable tablosundan içindekileri okuyoruz ve birinci bağlantıyı kapatıyoruz. Kaydedelim ve çalıştıralım.

    Bildirime bakalım:

    — ONCREATE ACTİVİTY —
    DELETE ALL FROM TABLE MYTABLE
    INSERT İN TABLE MYTABLE VALUE = VAL1
    CREATE DBHELPER
    GET DB
    CLASS ANDROİD.DATABASE.SQLİTE.SQLİTEEXCEPTİON ERROR: DATABASE İS LOCKED


    Bildirimde veri tabanına ikinci defa bağlantısında hata oluştuğunu görebiliriz. Eğer koddan işlemi yönetilen satırı siler ve yeniden programı çalıştırırsanız, bildirim hatayı göstermeyecek.

    İşlemi kullanmak tavsiye edilen formu aşağıdaki veriyorum:

    Kod:
    db.beginTransaction();
         try {
           ...
           db.setTransactionSuccessful();
         } finally {
           db.endTransaction();
         }
    
    Ders Sonu Notları:
    Bugünkü derslerimizde işlem (Transaction) konusuna değindik.

    Android Programlama Ders 42: SQLite’ta Veri Tabanı Güncelliyoruz


    [​IMG]
    Android Programlama Ders 42′de onUpgrade metodunu kullanarak SQLite’ta veri tabanı güncellemeyi öğreneceğiz.
    Uygulama geliştirirken zaman zaman veri tabanını güncelleme ihtiyacı oluşabiliyor. Geçen derslerde SQLiteOpenHelper klasının onUpgrade metodundan bahsettim. onUpgrade metodu, var olan veri tabanı bağlanmak istediğimiz veri tabanından farklıysa çağrılıyor.

    onUpgrade kullanarak veri tabanının yeni versiyona geçişi araştıralım. Bunu yapmak için küçük bir uygulama oluşturalım. Uygulama geçen derslerde yaptığımız “çalışanlar ve meslekleri” konulu olacak.

    Birinci versiyonda veri tabanımız sadece people (insanlar) tablosunu içerecek. Tablomuzun iki sütunu çalışanların isim ve mesleğini taşıyacak. Bu tablo pek kullanışlı değil, çünkü mesleğin ismi değiştiği zaman people tablosundaki tüm kayıtların güncellenmesi gerekecektir. Bu yüzden veri tabanında verinin yapısını değiştirmeye karar veriyoruz.

    İkinci versiyonda yeni tabloyu position (meslek) ekleyeceğiz. Position tablomuz iki sütundan (meslek ismi ve maaş) oluşacak. People tablosunda insanların mesleği yerinde position tablodan ID’sini kullanacağız

    Projeyi oluşturalım:

    • Project name: P0042_SQLiteOnUpgrade
    • Build Target: Android 4.2
    • Application name: SQLiteOnUpgrade
    • Package name: tr.example.sqliteonupgrade
    • Create Activity: MainActivity
    Ekranı kullanmayacağız tüm sonuçları bildirime yazdıracağız.

    MainActivity.java oluşturalım:

    Kod:
    import android.app.Activity;
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.os.Bundle;
    import android.util.Log;
    public class MainActivity extends Activity {
    final String LOG_TAG = "myLogs";
    
    final String DB_NAME = "staff"; // veri tabanin ismi
    
    finalintDB_VERSION = 1; // versiyonu
    
    /** Called when the activity is first created. */
    
    @Override
    
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
    
       setContentView(R.layout.main);
    
        DBHelper dbh = new DBHelper(this);
    
       SQLiteDatabase db = dbh.getWritableDatabase();
    
        Log.d(LOG_TAG, " --- Staff db v." + db.getVersion() + " --- ");
    
       writeStaff(db);
    
       dbh.close();
    
    }
    
    // kayitlari bildirime yazdiriyoruz
    
    private void writeStaff(SQLiteDatabase db) {
    
       Cursor c = db.rawQuery("select * from people", null);
    
       logCursor(c, "Table people");
    
       c.close();
    
    }
    
    // kursordan kayitlari bildirime yazdiriyoruz
    
    void logCursor(Cursor c, String title) {
    
       if (c != null) {
    
         if (c.moveToFirst()) {
    
       Log.d(LOG_TAG, title + ". " + c.getCount() + " rows");
    
           StringBuilder sb = new StringBuilder();
    
           do {
    
             sb.setLength(0);
    
             for (String cn : c.getColumnNames()) {
    
               sb.append(cn + " = "
    
                   + c.getString(c.getColumnIndex(cn)) + "; ");
    
             }
    
        Log.d(LOG_TAG, sb.toString());
    
           } while (c.moveToNext());
    
         }
    
       } else
    
       Log.d(LOG_TAG, title + ". Cursor is null");
    
    }
    
        class DBHelper extends SQLiteOpenHelper {
    
        public DBHelper(Context context) {
    
         super(context, DB_NAME, null, DB_VERSION);
    
       }
    
        public void onCreate(SQLiteDatabase db) {
    
        Log.d(LOG_TAG, " --- onCreate database --- ");
    
         String[] people_name = {"Ahmet", "Seyda", "Ali", "Omer", "Sevgi", "Umut", "Murat", "Mehmet"};
    
         String[] people_positions = {"Programci", "Muhasebeci", "Programci", "Programci", "Muhasebeci", "Mudur","Programci", "Guvenlik" };
    
         ContentValues cv = new ContentValues();
    
          // people tabolyu olusturuyoruz
    
         db.execSQL("create table people ("
    
             + "id integer primary key autoincrement,"
    
             + "name text, position text);");
    
          // dolduruyoruz
    
         for (int i = 0; i < people_name.length; i++) {
    
           cv.clear();
    
           cv.put("name", people_name[i]);
    
           cv.put("position", people_positions[i]);
    
           db.insert("people", null, cv);
    
         }
    
       }
    
       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
    }
    
    }
    Yukarıdaki verdiğim kodu inceleyelim.

    logCursor metodu kullanarak Cursor’dan kayıtları bildirime yazdırıyoruz. writeStaff metodu kayıtları people tablosundan seçiyor ve logCursor metodunu çağırıyor. Activity onCreate metodunda DBHelper nesneyi oluşturuyoruz ve veri tabanına bağlıyoruz. Sonra veri tabanının versiyonu bildirime yazdırıyoruz, writeStaff metodu çağırıyoruz ve bağlantıyı kapatıyoruz. onCreate metodunda tabloyu oluşturuyoruz ve dolduruyoruz.

    Kaydedelim ve uygulamayı çalıştıralım.

    Bildirimlere bakalım:

    — ONCREATE DATABASE —
    — STAFF DB V.1 —
    TABLE PEOPLE. 8 ROWS
    İD = 1; NAME = AHMET; POSİTİON = PROGRAMCİ;
    İD = 2; NAME = SEYDA; POSİTİON = MUHASEBECİ;
    İD = 3; NAME = ALİ; POSİTİON = PROGRAMCİ;
    İD = 4; NAME = OMER; POSİTİON = PROGRAMCİ;
    İD = 5; NAME = SEVGİ; POSİTİON = MUHASEBECİ;
    İD = 6; NAME = UMUT; POSİTİON = MUDUR;
    İD = 7; NAME = MURAT; POSİTİON = PROGRAMCİ;
    İD = 8; NAME = MEHMET; POSİTİON = GUVENLİK;

    Uygulamamız problemsiz çalışıyor. Tablonun kayıtlarını bildirimlere görebiliriz. Şimdi versiyonu güncellemek için bir planı oluşturalım.

    Planımız:

    position tabloyu oluşturuyoruz ve dolduruyoruz

    position tablosundan id kaydetmek için people tabloya posid sütunu ekliyoruz

    people.position değerlerine göre people.posid dolduruyoruz

    people.position sütununu siliyoruz

    MainActivity.java’yı değiştirelim. Uygulamamızın veri tabanı versiyonu eşittir iki olacak. DB_VERSION = 2’ye değiştiriyoruz.

    FİNAL İNT DB_VERSION = 2; // VERİ TABANİN VERSİYONU

    writeStaff metodu değiştiriyoruz:

    Kod:
     private void writeStaff(SQLiteDatabase db) {
           Cursor c = db.rawQuery("select * from people", null);
           logCursor(c, "Table people");
           c.close();
    
           c = db.rawQuery("select * from position", null);
           logCursor(c, "Table position");
           c.close();
    
           String sqlQuery = "select PL.name as Name, PS.name as Position, salary as Salary "
             + "from people as PL "
             + "inner join position as PS "
             + "on PL.posid = PS.id ";
           c = db.rawQuery(sqlQuery, null);
           logCursor(c, "inner join");
           c.close();
       }
    
    Bildirimlere people, position ve tabloların birleşimini yazdıracağız.

    DBHelper’de onUpgrade metodu gerçekleştireceğiz:

    Kod:
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          Log.d(LOG_TAG, " --- onUpgrade database from " + oldVersion
              + " to " + newVersion + " version --- ");
    
          if (oldVersion == 1 && newVersion == 2) {
    
            ContentValues cv = new ContentValues();
    
            // position tablo icin veriler
            int[] position_id = { 1, 2, 3, 4 };
            String[] position_name = { "Mudur", "Programci",
                "Muhasebeci", "Guvenlik" };
            int[] position_salary = { 15000, 13000, 10000, 8000 };
    
            db.beginTransaction();
            try {
              // position tabloyu olusturuyoruz
              db.execSQL("create table position ("
                  + "id integer primary key,"
                  + "name text, salary integer);");
    
              // dolduruyoruz
              for (int i = 0; i < position_id.length; i++) {
                cv.clear();
                cv.put("id", position_id[i]);
                cv.put("name", position_name[i]);
                cv.put("salary", position_salary[i]);
                db.insert("position", null, cv);
              }
    
              db.execSQL("alter table people add column posid integer;");
    
              for (int i = 0; i < position_id.length; i++) {
                cv.clear();
                cv.put("posid", position_id[i]);
                db.update("people", cv, "position = ?",
                    new String[] { position_name[i] });
              }
    
              db.execSQL("create temporary table people_tmp ("
                  + "id integer, name text, position text, posid integer);");
    
              db.execSQL("insert into people_tmp select id, name, position, posid from people;");
              db.execSQL("drop table people;");
    
              db.execSQL("create table people ("
                  + "id integer primary key autoincrement,"
                  + "name text, posid integer);");
    
              db.execSQL("insert into people select id, name, posid from people_tmp;");
              db.execSQL("drop table people_tmp;");
    
              db.setTransactionSuccessful();
            } finally {
              db.endTransaction();
            }
          }
        }
    
      }
    }
    Yukarıdaki kodda transaction (işlem) kullanıyoruz. Amacımız veri tabanında güncelleme olduğu zaman eğer hata olduysa tüm değişikliklerin iptal olmasıdır. Bu durumlarda transaction çok faydalı oluyor.

    İkinci önemli olay, güncelleme yaptığımız zaman geçici tabloyu oluşturmamız gerekiyor. Geçici tabloya kayıtları kopyalıyoruz. Sonraki aşamada eski tabloyu yok ediyoruz ve yeni güncellenmiş tabloyu oluşturuyoruz. Son aşamada geçici tablodan kayıtları kopyalıyoruz ve geçici tabloyu yok ediyoruz. Ayrıntılı bilgi almak için bu linkten faydalanabilirsiniz – How do I add or delete columns from an existing table in SQLite.

    Uygulamamız güncellendi. Uygulamayı çalıştırdığımız zaman veri tabanına bağlanacak, versiyon değişeceğini fark edecek ve onUpgrade metodu çağıracak. Kullanıcı uygulamayı ilk defa çalıştırıyor olabilir. Bu durumda uygulama veri tabanını ilk defa oluşturacak ve versiyon numarası eşittir iki olacak. Veri tabanını DBHelper klasta onCreate metodunda oluşturuyoruz. Bu demektir ki ikinci versiyonu oluşturmak için onCreate metodunu değiştirmemiz gerekiyor.

    onCreate metodu oluşturalım:

    Kod:
    public void onCreate(SQLiteDatabase db) {
          Log.d(LOG_TAG, " --- onCreate database --- ");
    
          String[] people_name = { "Ahmet", "Seyda", "Ali", "Omer", "Sevgi", "Umut", "Murat", "Mehmet" };
          int[] people_posid = { 2, 3, 2, 2, 3, 1, 2, 4 };
    
          // position tablo icin veriler
          int[] position_id = { 1, 2, 3, 4 };
          String[] position_name = { "Mudur", "Programci", "Muhasebeci",
              "Guvenlik" };
          int[] position_salary = { 15000, 13000, 10000, 8000 };
    
          ContentValues cv = new ContentValues();
    
          // position tabloyu olusturuyoruz
          db.execSQL("create table position (" + "id integer primary key,"
              + "name text, salary integer" + ");");
    
          // dolduruyoruz
          for (int i = 0; i < position_id.length; i++) {
            cv.clear();
            cv.put("id", position_id[i]);
            cv.put("name", position_name[i]);
            cv.put("salary", position_salary[i]);
            db.insert("position", null, cv);
          }
    
          // people tabloyu olusturuyoruz
          db.execSQL("create table people ("
              + "id integer primary key autoincrement,"
              + "name text, posid integer);");
    
          // dolduruyoruz
          for (int i = 0; i < people_name.length; i++) {
            cv.clear();
            cv.put("name", people_name[i]);
            cv.put("posid", people_posid[i]);
            db.insert("people", null, cv);
          }
        }
    
    Yukarıdaki kodda tabloları oluşturuyoruz ve dolduruyoruz. Şimdi uygulamayı kaydedelim ve çalıştıralım.
    
    Bildirimlere bakıyoruz:

    — ONUPGRADE DATABASE FROM 1 TO 2 VERSİON —

    — STAFF DB V.2 —

    TABLE PEOPLE. 8 ROWS

    İD = 1; NAME = AHMET; POSİD = 2;

    İD = 2; NAME = SEYDA; POSİD = 3;

    İD = 3; NAME = ALİ; POSİD = 2;

    İD = 4; NAME = OMER; POSİD = 2;

    İD = 5; NAME = SEVGİ; POSİD = 3;

    İD = 6; NAME = UMUT; POSİD = 1;

    İD = 7; NAME = MURAT; POSİD = 2;

    İD = 8; NAME = MEHMET; POSİD = 4;

    TABLE POSİTİON. 4 ROWS

    İD = 1; NAME = MUDUR; SALARY = 15000;

    İD = 2; NAME = PROGRAMCİ; SALARY = 13000;

    İD = 3; NAME = MUHASEBECİ; SALARY = 10000;

    İD = 4; NAME = GUVENLİK; SALARY = 8000;

    İNNER JOİN. 8 ROWS

    NAME = AHMET; POSİTİON = PROGRAMCİ; SALARY = 13000;

    NAME = SEYDA; POSİTİON = MUHASEBECİ; SALARY = 10000;

    NAME = ALİ; POSİTİON = PROGRAMCİ; SALARY = 13000;

    NAME = OMER; POSİTİON = PROGRAMCİ; SALARY = 13000;

    NAME = SEVGİ; POSİTİON = MUHASEBECİ; SALARY = 10000;

    NAME = UMUT; POSİTİON = MUDUR; SALARY = 15000;

    NAME = MURAT; POSİTİON = PROGRAMCİ; SALARY = 13000;

    NAME = MEHMET; POSİTİON = GUVENLİK; SALARY = 8000;

    onUpgrade metodunun çağırmasını görüyoruz. Veri tabanımız güncellendi ve ilk versiyondan ikinciye geçti. Güncellemenin başarılı olduğunu kontrol etmek için kayıtları bildirimlere yazdırıyoruz. onCreate metodunun çalışıp çalışmadığını kontrol etmek için veri tabanından dosyayı sileceksiniz ve uygulamayı yeniden çalıştıracaksınız. Uygulama çalıştığı zaman veri tabanını bulamayacak ve yeniden oluşturacak (Versiyon = 2).

    MainActivity.java tam kodu:

    Kod:
    import android.app.Activity;
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.os.Bundle;
    import android.util.Log;
    
    public class MainActivity extends Activity {
    
      final String LOG_TAG = "myLogs";
    
      final String DB_NAME = "staff"; // veri tabanin ismi
      final int DB_VERSION = 2; // versiyonu
    
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        DBHelper dbh = new DBHelper(this);
        SQLiteDatabase db = dbh.getWritableDatabase();
        Log.d(LOG_TAG, " --- Staff db v." + db.getVersion() + " --- ");
        writeStaff(db);
        dbh.close();
      }
    
      // verileri sorguluyoruz ve bildirimlere yazdiriyoruz
      private void writeStaff(SQLiteDatabase db) {
        Cursor c = db.rawQuery("select * from people", null);
        logCursor(c, "Table people");
        c.close();
    
        c = db.rawQuery("select * from position", null);
        logCursor(c, "Table position");
        c.close();
    
        String sqlQuery = "select PL.name as Name, PS.name as Position, salary as Salary "
            + "from people as PL "
            + "inner join position as PS "
            + "on PL.posid = PS.id ";
        c = db.rawQuery(sqlQuery, null);
        logCursor(c, "inner join");
        c.close();
      }
    
      // kursordan verileri bildirimlere yazdiriyoruz
      void logCursor(Cursor c, String title) {
        if (c != null) {
          if (c.moveToFirst()) {
            Log.d(LOG_TAG, title + ". " + c.getCount() + " rows");
            StringBuilder sb = new StringBuilder();
            do {
              sb.setLength(0);
              for (String cn : c.getColumnNames()) {
                sb.append(cn + " = "
                    + c.getString(c.getColumnIndex(cn)) + "; ");
              }
              Log.d(LOG_TAG, sb.toString());
            } while (c.moveToNext());
          }
        } else
          Log.d(LOG_TAG, title + ". Cursor is null");
      }
    
      class DBHelper extends SQLiteOpenHelper {
    
        public DBHelper(Context context) {
          super(context, DB_NAME, null, DB_VERSION);
        }
    
        public void onCreate(SQLiteDatabase db) {
          Log.d(LOG_TAG, " --- onCreate database --- ");
    
          String[] people_name = { "Ahmet", "Seyda", "Ali", "Omer", "Sevgi", "Umut", "Murat", "Mehmet" };
          int[] people_posid = { 2, 3, 2, 2, 3, 1, 2, 4 };
    
          // position tablo icin veriler
          int[] position_id = { 1, 2, 3, 4 };
          String[] position_name = { "Mudur", "Programci", "Muhasebeci",
              "Guvenlik" };
          int[] position_salary = { 15000, 13000, 10000, 8000 };
    
          ContentValues cv = new ContentValues();
    
          // position tabloyu olusturuyoruz
          db.execSQL("create table position (" + "id integer primary key,"
              + "name text, salary integer" + ");");
    
          // dolduruyoruz
          for (int i = 0; i < position_id.length; i++) {
            cv.clear();
            cv.put("id", position_id[i]);
            cv.put("name", position_name[i]);
            cv.put("salary", position_salary[i]);
            db.insert("position", null, cv);
          }
    
          // people tabloyu olusturuyoruz
          db.execSQL("create table people ("
              + "id integer primary key autoincrement,"
              + "name text, posid integer);");
    
          // dolduruyoruz
          for (int i = 0; i < people_name.length; i++) {
            cv.clear();
            cv.put("name", people_name[i]);
            cv.put("posid", people_posid[i]);
            db.insert("people", null, cv);
          }
        }
    
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          Log.d(LOG_TAG, " --- onUpgrade database from " + oldVersion
              + " to " + newVersion + " version --- ");
    
          if (oldVersion == 1 && newVersion == 2) {
    
            ContentValues cv = new ContentValues();
    
            // position tablo icin veriler
            int[] position_id = { 1, 2, 3, 4 };
            String[] position_name = { "Mudur", "Programci",
                "Muhasebeci", "Guvenlik" };
            int[] position_salary = { 15000, 13000, 10000, 8000 };
    
            db.beginTransaction();
            try {
              // position tabloyu olusturuyoruz
              db.execSQL("create table position ("
                  + "id integer primary key,"
                  + "name text, salary integer);");
    
              // dolduruyoruz
              for (int i = 0; i < position_id.length; i++) {
                cv.clear();
                cv.put("id", position_id[i]);
                cv.put("name", position_name[i]);
                cv.put("salary", position_salary[i]);
                db.insert("position", null, cv);
              }
    
              db.execSQL("alter table people add column posid integer;");
    
              for (int i = 0; i < position_id.length; i++) {
                cv.clear();
                cv.put("posid", position_id[i]);
                db.update("people", cv, "position = ?",
                    new String[] { position_name[i] });
              }
    
              db.execSQL("create temporary table people_tmp ("
                  + "id integer, name text, position text, posid integer);");
    
              db.execSQL("insert into people_tmp select id, name, position, posid from people;");
              db.execSQL("drop table people;");
    
              db.execSQL("create table people ("
                  + "id integer primary key autoincrement,"
                  + "name text, posid integer);");
    
              db.execSQL("insert into people select id, name, posid from people_tmp;");
              db.execSQL("drop table people_tmp;");
    
              db.setTransactionSuccessful();
            } finally {
              db.endTransaction();
            }
          }
        }
    
      }
    }
    Ders Sonu Notları:
    Bugünkü dersimizde onUpgrade metodu kullanarak veri tabanın versiyonu güncellemeyi öğrendik.

    Android Programlama Ders 43: SQLite Pratik

    [​IMG]
    Android Programlama Ders 43′te SQLite alfabesini pratik örneklerle gözden geçireceğiz.
    Temel komutlara genel olarak bakalım:

    Yeni tabloyu oluşturuyoruz. tbl_info:

    Kod:
    CREATE TABLE tbl_info (_id integer PRIMARY KEY AUTOINCREMENT,
       name text NOT NULL,
       age integer NOT NULL,
       city text NOT NULL);
    Tabloyu siliyoruz:

    Kod:
    DROP TABLE IF EXISTS tbl_info;
    
    Tabloyu ekliyoruz:

    Kod:
    INSERT INTO tbl_info(name, age, city) VALUES ("Ahmet", 29, "Istanbul, Turkiye");
    
    Tablodaki kaydı güncelliyoruz:

    Kod:
    UPDATE tbl_info SET age=12 WHERE _id=1;
    
    Tablodaki kaydı siliyoruz:

    Kod:
    DELETE FROM tbl_info WHERE _id=1;
    
    Tüm kayıtları siliyoruz:

    Kod:
    DELETE * FROM tbl_info;
    
    Tüm sütunları seçiyoruz:

    Kod:
    select * from table1;
    
    Sütunların sayısını hesaplıyoruz:

    Kod:
    select count(*) from table1;
    
    Belirli sütunları seçiyoruz:

    Kod:
     select coll, соl2 from table1;
    
    Belirli sütundan değeri seçiyoruz:

    Kod:
     select distinct col1 from table1;
    
    Belirli sütunun değerini hesaplıyoruz:

    Kod:
     select count(col1) from (select distinct col1 from table1);
    
    Gruplamayı yapıyoruz:

    Kod:
     select count(*), col1 from table1 group by col1;
    İki tabloyu birleştiriyoruz:

    Kod:
     select * from table1 tl, table2 t2where t1.col1 = t2.col1;
    
    SQLite öğrenmeye devam edelim. Bunu yapmak için sqlite3.exe programı kullanacağız. Bunu android-sdk içinde tools dosyasında bulabilirsiniz. Şimdi sqlite3 dosyayı size uygun başka bir yere kopyalayıp kullanabiliriz. Yeni oluşturduğunuz dosyada shift düğmeye basıp boş yere farede sağa düğmeye basıyorsunuz. Karşınıza aşağıdaki verdiğim pencere çıkacak:

    [​IMG]

    Kırmızıyla işaretlendiğim seçeneği kullanarak komut satırı açacağız.

    [​IMG]

    Veri tabanı oluşturmak için sqlite3 base.db komutu gireceğiz ve Enter’a basacağız. Tabloyu oluşturalım. Tablonun ismi test olsun:

    SQLİTE> CREATE TABLE TEST (İD İNTEGER PRİMARY KEY, VALUE TEXT);

    Tablomuz iki sütundan oluşuyor. Birinci sütun id’miz integer tipinde ve ikinci sütun metin içerecek. Tabloya birkaç tane sütun ekleyelim:

    SQLİTE> İNSERT İNTO TEST (İD, VALUE) VALUES(1, ‘AHMET’);

    SQLİTE> İNSERT İNTO TEST (İD, VALUE) VALUES (2, ‘BARİS’);

    SQLİTE> İNSERT İNTO TEST (VALUE) VALUES(‘OMER’);

    SQLİTE> İNSERT İNTO TEST (VALUE) VALUES (‘ALİ’);

    Burada verileri eklemek için iki yöntem kullandım. Birinci yöntemde iki parametre belirliyoruz ve onlara göre iki değeri (id’nin numara ve ismi) giriyoruz. Birinci parametreyi (id) girmeden direkt ismi girebiliriz. Bu ikinci yöntemimiz. Belirleyici (id) otomatik olarak bire artıyor. Bunu görmek için aşağıdaki verdiğim komutları kullanabilirsiniz:

    SQLİTE> .MODE COLUMN

    SQLİTE> .HEADERS ON

    SQLİTE> SELECT * FROM TEST;

    Yukarıdaki komutları kullanarak aşağıdaki verdiğim tabloyu oluşturabilirsiniz:

    İD VALUE———- ———-

    1 AHMET

    2 BARİS

    3 OMER

    4 ALİ

    [​IMG]

    .mode ve .headers komutları kullanarak ekranda görünecek tablonun görünüşünü ayarlayabilirsiniz. Başka komutları incelemek için .help komutu kullanabilirsiniz.

    SQLİTE> SELECT LAST_İNSERT_ROWİD();

    Yukarıdaki komutu kullanarak son eklenen id öğrenebilirsiniz. Bizim örnek için cevap eşit 4 olmalı. Son iki komutu girelim:

    SQLİTE> CREATE İNDEX TEXT_İDX ON TEST (VALUE);

    SQLİTE> CREATE VİEW SCHEMA AS SELECT * FROM SQLİTE_MASTER;

    Sqlite3 ile işimizi bitirmek için .exit komutu kullanacağız.

    Ders Sonu Notları:
    Bugünkü derslerimizde SQLite’a ait temel komutları inceledik.

    Android Programlama Ders 44: SQLite Pratik – Bölüm 2


    [​IMG]
    Android Programlama Ders 44′te SQLite komutlarını pratik örneklerle incelemeye devam edeceğiz.
    Geçen derslerimizdeki gibi sqlite3 base.db komutu kullanarak veri tabanı açalım. Veri tabanını önceki derslerimizde oluşturduğumuz için yenisi yaratılmayacak, olan veri tabanı açılacak. Bunu kontrol etmek için aşağıdaki verdiğim komutu kullanabilirsiniz:

    SQLİTE>.TABLES

    Ekranda schema test yazısını görüyoruz. Şimdi veri tabanına ait bilgileri öğrenmek için farklı yöntemleri inceleyelim. Son derste tablo için indeksleri oluşturduk. İndeks hakkında bilgi almak için aşağıdaki komutu kullanabilirsiniz:

    SQLİTE> .İNDİCES TEST

    Ekranda text_idx yazıyı görüyoruz.

    Tablonun yapısı öğrenmek için:

    SQLİTE> .SCHEMA TEST

    Sonuç:

    CREATE TABLE TEST (İD İNTEGER PRİMARY KEY, VALUE TEXT);

    CREATE INDEX TEXT_İDX ON TEST (VALUE);



    Bilgileri öğrenmek için başka da komutlar mevcut:

    type – nesnenin tipi

    name – nesnenin ismi

    tbl_name – nesneyle bağlı olan tablo

    sqlSQL tınımlıyor (DDL)

    Aşağıdaki verdiğim komutları girelim:

    SQLİTE> .MODE COLUMN

    SQLİTE> .HEADERS ON

    SQLİTE> SELECT TYPE, NAME, TBL_NAME, SQL FROM SQLİTE_MASTER ORDER BY TYPE;

    Sonuç:

    TYPE NAME TBL_NAME SQL

    ———- ———- ———- ————————————-

    İNDEX TEXT_İDX TEST CREATE INDEX TEXT_İDX ON TEST (VALUE)

    TABLE TEST TEST CREATE TABLE TEST (İD İNTEGER PRİMARY

    VİEW SCHEMA SCHEMA CREATE VIEW SCHEMA AS SELECT * FROM S

    [​IMG]

    Bu komutları kullanarak veri tabanına ait bilgilere ulaşabiliriz. Yabancı veri tabanı araştırdığınız zaman da kullanabilirsiniz.

    Verileri SQL formata .dump komutu kullanarak ihraç edebiliriz. Argümanları kullanmadığımız zaman tüm veri tabanı ihraç edilecek. Verileri dosyaya ihraç etmek için .output [filename] komutu kullanılıyor. Verileri ekranda kullanmak için .output stdout komutu kullanılıyor.

    SQLİTE> .OUTPUT FİLE.SQL

    SQLİTE> .DUMP

    SQLİTE> .OUTPUT STDOUT

    Komutları çalıştırdıktan sonra diskte file.sql dosya oluşacak.

    Verileri ithal etmek için iki yöntem mevcuttur. Verileri SQL formata olduğu zaman .read komutu kullanılıyor. Eğer dosya CSV formataysa .import [file][table] komut kullanılıyor.

    Bizim örnekte file.sql formata o yüzden .read komutu kullanacağız. İlk başta test tablodan tüm verileri silecek ve file.sql dosyadan verileri kopyalacağız. Kopyalama olup olmadığını kontrol etmek için file.sql dosyada ilk ismi değiştirelim (İlk isim Osman olsun). Değiştirmek için dosyayı Notepad ile açabilirsiniz.

    SQLİTE> DROP TABLE TEST;

    SQLİTE> DROP VİEW SCHEMA;

    SQLİTE> .READ FİLE.SQL

    SQLİTE> SELECT * FROM TEST;

    [​IMG]

    Gördüğünüz gibi file.sql dosyadan test tabloya verileri kaydettik.

    Bazen tablonun bir kısmı kaydetmek gerekiyor. Mesela tabloda bulunan is ile biten kayıtları kaydedelim. Bizim örnekte is ile biten bir tane kayıt mevcut (Baris).

    SQLİTE> .OUTPUT İS.CSV

    SQLİTE> .SEPARATOR ,

    SQLİTE> SELECT * FROM TEST WHERE VALUE LİKE ‘%İS’;

    SQLİTE> .OUTPUT STDOUT

    Yukarıdaki verdiğim komutlarda .separator , komutu id ve isim arasında virgülü koyuyor. Şimdi is.csv dosyadan kayıtları yeni tabloya yerleştirelim.

    SQLİTE> CREATE TABLE TEST2(İD İNTEGER PRİMARY KEY, VALUE TEXT);

    SQLİTE> .İMPORT İS.CSV TEST2

    Ders Sonu Notları:
    Bugünkü dersimizde sqlite’ta verileri ithal ve ihraç etmek için kullanılan komutları inceledik.​
    25 Aralık 2016
    #1
  2. Android Programlama Dersleri(41,42,43,44) Cevapları

soru sor

Android Programlama Dersleri(41,42,43,44)