Cadı

31 Mart 2012 Cumartesi

Geçenlerde Carrefourdayken indirime giren kitaplar kısmında görüp, alayım ya okurum diye aldığım kitap. Daha öncesinde hakkında hiç bir fikrim yoktu. Hatta kitabı okumaya başlarken fark ettim ki aslında bu bir kitap serisiymiş, o derece varlığından habersiz olduğum bir kitap kendisi.

"Sisters of the Moon" serisinin ilk kitabı cadı. Kitabı ilk okumaya başladığımda aha dedim Harry Potter tarzı bir şeyle karşı karşıyayım. Çünkü kitapta ne ararsanız var. Cadı, kedi kadın, kuş kadın, puma adam, vampir , ejderha , cin , kraliçe , cüce , ev cini , ten gezici , Svartan ve şu an aklıma gelip sayamadığım bir çok varlık. Yalnız, okudukça farkına vardım ki bu kitabın Harry Potter benzerliği bir yere kadarmış. Çünkü çocuklara ithaf ettiğini pek düşünmüyorum. Tam olarak , nasıl bir kitap derseniz , kitabın arka kapağında yapılmış olan ve gerçekten kitabı tam anlamıyla yansıtan bir yorum mevcut:

“Cadı, seksi, fantastik, doğaüstü, gizemli ve romantik bir kitap.” 

Terese Rain


Aynen böyle bir kitap. Gerçekten okurken keyif alıyorsunuz. Çerez niyetine okunup , iyi vakit geçirilesi ve eğlenilesi bir kitap. Bulduğum an serinin 2. kitabını da alıp seriye devam etmek istiyorum. Merak ediyorum . Ayrıca ilk kitabı cadı olan karakterin ağzından okuyorsunuz ama 2.kitap kedi kadının ağzından. Bu da daha çekici kılıyor seriyi benim gözümde. Yasmine Galenorn'u bu hayal gücünün yüksekliğinden dolayı tebrik ediyorum ve kitabı öneriyorum.

Zaman Çarkı

24 Mart 2012 Cumartesi

"Sil Baştan'ın Yazarından" sloganı ile sükse yapmış ( yapmaya çalışmış ) kitap.

Kitabın kapağını elime alınca, ölümsüzlük ceza mı ödül mü temalı , çekici ve çarpıcı  başlığını okuyup, aha bunda güzel bişeyler yazıyodur, kurgusu değişiktir , acaba sonunda ne olur gibi düşüncelere dalıp okumaya başladığım ama maalesef aradığımı bulamadığım bir kitap. Bir kere kitap içinde geçen isimleri kafamda tutmakta çok zorlandım. Fransızca ( sanırım ) ağırlıklı, uzun uzun isimler.. Sürekli ulan bu kimdi ya diyip kitabın sayfalarını çevirdim. Bilmemne kralı ölünce , yerine bilmemne oğlu gelicek de derken bilmemne kraliçesi, bilmemne rahibesi çocukları büyütücek de.. Kısacası kitabın başlarında, kitaba adapte olmak da çok zorlandım.

Sonra, daha önce okuduğum bir çok kitapta yaşadığım, ulan şimdi nolucak ya  uykum da geldi ama kitabı bırakmak istemiyorum, şu bölümü de okuyım, ondan sonra yatarım olayını bu kitabı okurken hiç yaşayamadım. Evet okudum, ama heyecansız bir şekilde, zaman öldürmek adına.

Kitap boyunca, ölümsüz olan kadın , sürekli çevresinde sevdiği insanların ölümlerine tanık oluyo ve hiç yaşlanmadığı için de sürekli yer değiştirmek zorunda kalıyo. Kitabın seyri tamamen böyle. Ve bu nedense çok itti, çok sıktı. Beklediğim gibi bir ilginçlik hiç olmadı. Sürekli monoton bir seyir çizmiş yazar.

Kitabı okurken hep bir ümit, sonunda iyi birşeyler olucak, etkileyici bir son olucak, yok artık falan dicem diye bekledim ama nafile. Bana göre tamamen fos bir son oldu. Bu muydu yani sonu, diye kalakaldım. Okunası bir kitap, zaman geçirmek için okunabilir bir kitap ama büyük beklentileri olanlar için de hayal kırıklığına sebebiyet olacak bir kitap.

Zebani

19 Mart 2012 Pazartesi

New York Times BestSeller yine her zamanki gibi. Okuduğum diğer kitaplardan oldukça farklı bir yapısı vardı. Hem konu olarak hem de konunun gidişatı olarak. Okuması kolay ama anlatması zor olan bir kitap.

Kapağına bakınca,melek kanatları vs. görüp aha işte gene melekler var,fantastik kitap,kesin zebani bir şeyler yapıyodur,birine,bir insana falan aşık oluyodur ya da dünyaya geliyodur falan diye düşündüren ama bu düşünceden sadece fantastik(!) olabileceği kısmının doğru olduğu kitap.

Bi kere en başta söylemem gereken şey kitabın ön kapağına +18 uyarısı koymalı. Çünkü,bazı kısımlar gerçekten bu nitelikte. Yazarın eskiden yaptığı işini anlatması olsun,başına gelenlerden sonra yaşadığı bazı şeyler olsun,bunlar çocuklara (!) uygun değil. Tabi çocuktan çocuğa fark vardır,orası ayrı.

Kitapta adam bir kaza geçiriyor ve kazada yanıyor. Tanınmaz hale geliyor az buçuk. Hastanede kaldığı sürece,şizofren tanısı konmuş bir kadın sürekli bu adamı ziyaret ediyor ve "bu senin ilk yanışın değil,daha önce de yanmıştın" gibi esrarengiz cümleler sonrası adama hikayeler anlatıyor. Daha önce (700 yıl önce) nasıl tanıştıklarından,neler olduğundan falan bahsediyor kitap boyunca. Şizofren olduğu için kadına inanası gelmiyor tabi adamın. Ama kitabın sonunda bazı şeyler oluyor ve hem adam hem de okuyucu şaşırıyor. Nasıl yani,acaba gerçek miymiş moduna giriyorsunuz. Hatta ben kitabın sonunda, gerçek bir yaşantıdan alıntıdır falan gibi bir uyarı görmeyi bekledim ama göremedim. Hepsi tamamen yazarın hayal gücüymüş. Bu yüzden de yazarı tebrik ediyorum.

Zil Çalmaktan Nefret Ederim!

15 Mart 2012 Perşembe

Bugün yine başıma en nefret ettiğim şeylerden biri geldi: Zil çalma mevzusu.

Olay şöyle cereyan etti: Okula gitmek üzere evden çıkmıştım, merdivenlerden aşağı koşar adım inerken,tam bir anda bulunduğum kattaki kapının zili çalındı aşağıdan. Kadında sanki,kapıda ne zaman zil çalacak da açıcam diye  bekliyormuş gibi zank diye açtı kapıyı. Ama anladığım kadarıyla beklediği biri yoktu ki, bana bön bön bakmaya başladı. Malum ben hızlı olarak hareket ediyorum ve zili çalıp kaçıyorum(!) kadına göre. Sanki öyle bir havaya girdi. Evet dedi,ne istemiştin? (Tövbe yarabbim), bir isteğim yok teyze,çocukluğumu yaşayamadım da zile basıp kaçayım dicektim de zor tuttum kendimi. Aşağıdan bastılar dedim. Hıı dedi,otomatiğe bastı ve kapıyı kapar gibi yaptı. Sonra aşağıya indim ama kapıda kimse yoktu. Kadın, yukarı çıkan biri olmadığını anladığında kim bilir arkamdan nasıl komplolar kurmuş,neler düşünmüştür.Evet küçükken o teyzenin kapıda bıraktığı bir çift ayakkabının,bir tekini alıp 2 kat aşağıdaki dairenin önüne bırakmış olabilirim. Hatta bunu hemen hemen her gün yapıp,bundan büyük zevk de almış olabilirim ama valla bugün ben bir şey yapmadım!

Böyle durumları hiç sevmemişimdir,hani olmamanız gereken bir yerde olmanız durumu. Umarım böyle durumlar hiçbirinizin başına gelmez.

Bir Milyon Küçük Parça

14 Mart 2012 Çarşamba

Dün gece okumayı bitirdiğim, yazarın bir uyuşturucu ve alkol bağımlısının ( kendisinin !) nasıl o hale geldiğini ve bundan kurtulma sürecini yazdığı kitap. Artık ölme noktasına gelmiş James Frey,bir kiliniğe yatırılıyor ve bağımlılıklarından kurtulmaya çalışıyor. Bu sürecin ne kadar zorlu olduğu tüm kitap boyunca üzerinde durulan noktalardan en önemlisi. Öyle ki hemen hemen her gün kan kusuyor, rüyalarında uyuşturucu aldığını görerek zorlanıyor,sürekli titremeler geliyor ve yemek dahi yiyemiyor.

Frey, kliniğe yatırılmadan önce öndeki 4 dişi olmaksızın,burnu kırılmış ve yanağında da kocaman bir delikle bir uçakta uyanıyor ve oraya nasıl geldiğine dair hiçbir fikri yok.Kitap buradan başlıyor ve gerçekten etkileyici bir sonla da bitiyor.

Klinikte bağımlı hastalar arasındaki arkadaşlık ilişkileri oldukça kuvvetli bir halde ve bu beni şaşırtan noktalardan biri. Hatta,bizim gibi normal insanları (!) yanlarında görmek istemiyorlar genelde.Öfke duyuyorlar ilginç bir biçimde.Kitabın sonlarına doğru,tüm bu arkadaşların klinikten çıktıktan sonra ne duruma geldikleri de söyleniyor ve çoğu başarısız oluyor. Bu bağımlılıktan kurtulabilme oranı yaklaşık %13-%15 arasında. Bu kişilerden kimi tekrar bu illete geri dönüyor, kimi öldürülüyor,kimi intihar ediyor. O yönden çarpıcı bir kitap ve New York Times BestSeller yine.

Kitabın gözümde ayrı bir yeri var.Çünkü yazımı tamamen diğer kitaplardan farklı. Biri "..." dedi gibi bir cümle bulamazsınız içinde.Neredeyse noktalama işareti kullanmayacakmış yazar o derece.Bir örnek vereyim hatta size:

İyi misin?
Bilmiyorum.
Neden?
Bilmiyorum işte.
İyileşmek istiyor musun?
Onu da bilmiyorum.
Gülüyorum.
Neden gülüyorsun?
Çünkü komik.
Neresi komik?

gibi konuşmalar geçiyor bütün kitapta. Bu yönden, ben çok daha rahat okudum. Kim bilir, belki daha zor okuyan da vardır. Ama bildiğim tek şey herkesin okuması gerektiği bu kitabı.

P.S : Okumak isteyen olursa, kitabın devamı da mevcut.Adı "Arkadaşım Leonard". ( New York Times BestSeller tabiki de.:))

Vittorio,The Wampire

13 Mart 2012 Salı

Geçen hafta okumayı bitirdiğim Anne Rice romanı.(Anne Rice'ı bilmeyenler için,Interview with the Wampire kitabının da yazarıdır.)

Benim elimdeki baskıda kitabın kapağı daha farklı.Tersten durmuş,siyahlar giymiş bir kadın (!) var.Dolayısıyla en başından beri ben Vittorio'yu kadın olarak düşünürken,babasıyla bir konuşmasında,babasının "oğlum" demesi üzerine,noluyoruz lan,bu karı, erkek miymiş moduna girdiğim bir roman. 

Erkek olan Vittorio,roman boyunca nasıl bir vampire dönüştüğünün hikayesini anlatıyor. Bazı yerleri komik,bazı yerleri dramatik,bazı yerleri çok edebi kitabın. Şöyleki vampirler,bunun ailesinden haraç istiyorlar.Vermeyince Vittorio'nun tüm sülalesini deşiyorlar.Kadın vampirlerden biri ise,Vittorio'ya aşık oluyor,ona kıyamıyor ve onu öldürmüyorlar.Tabi Vittorio,intikam ateşiyle doluyor.Bazı yerleri atlıyorum,vampirlerin bulunduğu yere geliyor hepsini öldürmek için.Yalnız terbiyesini hiç bozmuyor."Efendim,neden ailemi öldürdünüz" gibi edebi cümleler okuduğumu hatırlıyorum. İşte bu kısımları bana komik gelmişti. Her neyse,sonuç olarak tüm vampirleri öldürüyor ama ona aşık olan vampire kıyamıyor.Daha sonra bu vampir karı,eğer benim kanımı içersen ben günahlarımdan arınırım diye kandırıyor bunu.Bizim sazanda hemen atlıyor,kanı içiyor ve vampir oluyor! (Evet,burası da komik gelmişti.) Sonunda, her insan ruhunun bir ışık saçtığını ve bu ışığı söndürmenin onun için ne kadar zor olduğunu söylüyor.

Bu kitap,zamanında "New York Times BestSeller" olmuş.O yüzden merak ettim,aldım okudum. O kadar iyi olduğunu düşünmesem bile okumaya değer bir kitap bence.

Bir Gün (One Day)

8 Mart 2012 Perşembe

Geçen hafta okumayı bitirdiğim ve bu hafta da filmini izlediğim yapıt...

Başta çok anlamadım,ne biçim kitap lan bu böyle dedim.Çünkü bölümler arasında yıllar oynuyordu,bölümler arasında ilişki kuramamıştım.Ama daha sonradan farkettim ki,her bölüm 15 Temmuz ve bir sonraki yıl.Yani Em ve Dex'in ilk tanıştıkları(!) gün olan 15 Temmuz da, her ikisinin de ne yaptığını gösteren birer kesit her bir bölüm.
Em ve Dex aslında birbirlerinden hoşlanıyorlar ama hayattan beklentileri ve yapmak istedikleri farkı şeyler.Bu yüzden de farklı hayatlar yaşıyorlar,işte bunu anlatıyor kitap.Aslında birbirini seven iki insanın,sırf farklı istekleri var diye birlikte olamayışları ama sürekli birbirlerini düşünüyor olmaları. Bu yönden bence oldukça etkileyici bir kitap.Em ve Dex,Dex ve Em.Bu ikilimeyi(!) ne zaman okusam,içim bir garip oldu,kırıldı geçti.Sanırım duygusala bağladım bilmiyorum.

Sonra her meşhur ve iyi satan kitabın başına gelen şeyi yani filmini izledim.Hem kitapta hem filmde ağladım.Evet,fazla duygusal olabilirim.(Bkz. Harry Potter izlerken ağlayan kız.) Çünkü hem kitabın hem filmin öyle çarpıcı bir noktası var ki,yapma yaaa diyorsunuz.Beklenmedik bir anda.çat.Sizi alaşağı ediyor.Tam mutluyken,içiniz sıcacıkken,bir anda tersine dönüyor herşey.Ne biliyim anlatamıyorum.En iyisi izleyin.Hatta önce okuyun,sonra izleyin.Ha,aklıma gelmişken,filmle ilgili söylemek istediğim bir şey daha var.Film ve kitap oldukça benzer.Sırf modernleştirmek adına çok fazla şey değiştirilmemiş.Hatta söylenen cümlelere kadar aynı olan yerler var.

Sonuç olarak söylemek istediğim,dram ve romantik filmlerden hoşlananlar mutlaka izlesin,kaçırmasın.

Ders 21: Sliding Gallery

7 Mart 2012 Çarşamba
Evet, eninde sonunda uğraştığım,yapmaya çalıştığım şeyi başardım! Artık elimde sürekli kayan,son elemana gelince başa dönüp,sürekli dönüp duran bir gallery var artık. Şimdiki konumuzda gallery ve bu kayma işlemi üzerine.
Main.xml içine geliyoruz ve tasarımımızı gerçekleştiriyoruz:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Gallery
    android:id="@+id/gallery"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
</LinearLayout>

Görüldüğü üzere burada bir gallery oluşturuyoruz. Öyle farklı bir kodu da yok.

Daha sonra activity dosyamızın içine geliyoruz. onCreate metoduna girmeden hemen önce kullanacağımız değişkenleri tanımlıyoruz. Bunlardan gallery değişkenini malum main.xml içinde tasarladığımız gallery’e erişmek için kullanıcaz. Text adındaki string arrayimizi ise, gallery içinde kullanacağımız,göstereceğimiz elemanları belirlemek için kullanacağız.


Gallery gallery;
String [] text;

Artık yazdığımız kodları onCreate metodu içinde gerçekleştiriyoruz.Gallery’imize erişiyoruz:


gallery=(Gallery)findViewById(R.id.gallery);

String array’imizin elemanlarını yazıyoruz:



text=new String[]{"Hello\t\t","\t\tHi\t\t","\t\tAlloha\t\t",
                            "\t\tBonjour\t\t","\t\tHallo\t\t","\t\t¡Hola\t\t"};

Burada gördüğünüz \t\t kısımları sizi şaşırtmasın,ben itemlar arasında boşluk olsun diye böyle bir şey yaptım.İsteyen yapmasın.Zorunlu bir kullanım değil.

Yeni bir array adapter oluşturuyoruz ve bunun üzerinden string arrayimizin üzerindeki verileri gallery içine aktarmış oluyoruz. Aynı ListView kullanımı gibi.


ArrayAdapter arr=new ArrayAdapter(this,android.R.layout.simple_gallery_item, text);
gallery.setAdapter(arr);

Şimdi Handler sınıfından yeni bir örnek oluşturuyoruz. Ancak değişken tanımlamasını yine onCreate dışında yapalım ki,buna daha sonra başka bir metot içinden de erişebilelim:

onCreate’in hemen üstünde,diğer değişkenlerin altına şunu yazıyoruz:


Handler handler;

onCreate metodu içinde ise oluşturma işlemini gerçekleştiriyoruz:


handler= new Handler();


Bu Handler nesnesini nerede ve hangi amaçla oluşturup,kullandığımızı birazdan açıklayacağım.

Şimdi run() metodumuzu çağırıyoruz. Bu run() metodu Runnable arayüzüne ait ve içi boş durumda bir metot. Bunu çağırabilmek için Runnable arayüzünü implement ediyoruz,run metotudunu çağırıyoruz.



public class GalleryActivity extends Activity implements Runnable
run();

Şimdi yapmamız gereken tek şey ise , run() metodunu tanımlayıp,içini doldurmak.


@Override
     public void run() {
             // TODO Auto-generated method stub
            PicPosition = gallery.getSelectedItemPosition() +1; 
            if (PicPosition == text.length)
            {
            PicPosition=0;
             gallery.setSelection(PicPosition);
            }
            else
            {
            gallery.setSelection(PicPosition);//bir sonraki elemana git.
            }
            handler.postDelayed(this, 1000); //her saniye çalıştır
}

Burada picPosition adında bir değişkenimiz var. Bunu da onCreate metodundan hemen önce tanımlıyoruz tabiî ki.


private int PicPosition;


gallery.setSelection(PicPosition) ile item seçimi yapıyoruz,if içerisinde eğer son itema geldiysek,tekrar ilk itema dönme işlemini yapıyoruz. postDelayed() metodu ile ise bu işlemlerin kaç saniyede bir gerçekleşeceğini tanımlıyoruz.Yani handler nesnesini kayma işleminin ne kadar sıklıkta olacağını belirtmek için kullanıyoruz.
İşte hepsi bu kadar.

Artık elimizde her saniye bir item kayan bir gallery mevcut.

Ders 20: Android External Database Connection

Evet,sonunda zaman buldum,yarattım. Ve kaldığımız yerden devam ediyoruz. Konumuz external database bağlantısını gerçekleştirmek.
Genel olarak önce kodları verip,daha sonra onların ne anlam ifade ettiğini açıkladım. Okurken şaşırmayın.

Öncelikli olarak SQLite Database Browser kullanarak, database içinde bulunan tabloları ve bu tabloların alanları ile verilerini (insert ile eklenen verileri) oluşturuyoruz. Bunu başka bir derste detaylı olarak anlatabilirim. Çok basit bir yapısı var bu programın. Add Table diyip yeni bir tablo oluşturabiliyorsunuz ve hiç insert cümleciği yazmadan bile veri ekleyebiliyorsunuz.

Main.xml içerisine gelip , tasarımımızı oluşturuyoruz. Ben bir listview kullanmayı uygun gördüm. Database üzerinden veri çekip bu listview’in elemanları olarak göstermek istedim. Listview’i daha önceden anlatmıştım,o yüzden onun da pek üzerinde durmuyorum. Kodları ise şöyle oluyor:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="fill_parent"
       android:layout_height="wrap_content"
        android:text="@string/hello" />
  
<ListView
             android:id="@+id/contentlist"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"/>
</LinearLayout>

İsteyen buradaki TextView’i kaldırabilir tabiî ki. Ben üşendiğim için, direkt varolan main.xml içerisine ListView eklemesi yaptım.
 SQLite Database Browser ile oluşturduğumuz .db uzantılı database dosyaımızı , ilgili projemiz içindeki “Assets” klasörü altına atıyoruz.


   “src” klasörü içindeki com… adlı paketimizin altına DatabaseHelper adında bir java dosyası oluşturuyoruz.

İçini ise şöyle düzenliyoruz:

public class DatabaseHelper  extends SQLiteOpenHelper

SQLiteOpenHelper sınıfını extends ediyoruz,öncelikle. Böylece bu sınıfımızın database için kullanılacağını belirtmiş oluyoruz.


private static String DB_PATH = "/data/data/tr.edu.kelimeavcisi/databases/";
private static String DB_NAME = "tatliavcisi.db";

Path ve database adımızı belirtiyoruz. Db_Path değişkenini , database’imizin nerede olduğunu programa anlatmak için kullanıyoruz.Assets içine koyduğumuz tatliavcisi.db dosyası /data/data/packagename/databases/ dizini altında bulunduğu için,bunu kendimize göre ayarlıyoruz. Db_Name değişkenine de database dosyamızın adını yazıyoruz.


private SQLiteDatabase myDataBase;
private final Context myContext;

Şeklinde 2 değişken daha tanımlıyoruz, bunlardan myDatabase değişkenini, database üzerinde işlem yapabilmek için kullanacağız. myContext ise yine context değeri için kullanılacak.


public DatabaseHelper(Context context) {
      super(context, DB_NAME, null, 1);     
     this.myContext = context;
                                         }

Constructor metodumuzu yazıyoruz. Burada super metodu içindeki DB_NAME değişkenini yukarıda tanımlamıştık, 1 yazan değer ise bizim database’imizin sürümü.İstiyosanız 2,3 yazın,size kalmış.İlla 1 olucak diye bir kaide yok!


public void createDataBase() throws IOException{
        boolean dbExist =checkDataBase();
             if(dbExist){
             //bir şey yapma,zaten database mevcut.
              }else{
      
     this.getReadableDatabase();
             try {   
                copyDataBase();
             } catch (IOException e) {
       
            throw new Error("Error copying database");
      
     }  
   }
    }

Bu method kullanılarak default sistem pathi üzerinde boş bir database oluşturulacak, eğer bir database mevcut ise de o database bunun üzerine yazılacak. Burada Exception kullanarak, kodumuzu daha sağlıklı bir hale getirdik, eğer kopyalama (ya da siz buna üzerine yazma diyebilirsiniz) esnasında bir hata olursa,bize “Error copying database” şeklinde bir hata verecek. Buradaki checkDatabase()  ve copyDatabase() metodlarını da biz yazıyoruz. Dolayısıyla eğer şu anda bir hata mesajı alıyorsanız gayet normal. Tabiki gerekli importları da yapmadığınızı düşünürsek gene hata mesajı alabilirsiniz.


privat boolean checkDataBase(){
     SQLiteDatabase checkDB = null;
   try{
           String myPath = DB_PATH + DB_NAME;
       checkDB = SQLiteDatabase.openDatabase(myPath,null
SQLiteDatabase.OPEN_READONLY);
  
   }catch(SQLiteException e){
         //database does't exist yet.
       }
       if(checkDB != null){
             checkDB.close();
       }
       return checkDB != null ? true : false;
        }

checkDatabase() metodu sürekli olarak yeni bir database yaratılıp, onun üzerine kopyalama işleminin yapılmasını engelleyecek bir metot aslında. Daha önceden yaratılmış bir database olup olmadığına bakıyoruz ve varsa tamam, bir şey yapma diyoruz. Aslında olay bu kadar basit.

Burada /data/data/package_name/databases/database_name dizininde bir database olup olmadığına bakılıyor. Eğer sonuç olarak “null” dönerse, böyle bir database olmadığı anlaşılacak ve yeni bir database yaratılacak, eğer “null” değeri dönmezse , onun yerine bir database örneği dönerse , zaten böyle bir database’in var olduğunu anlayacağız ve yeni bir database yaratmamıza gerek kalmayacak.


private void copyDataBase() throws IOException{
   //Local database’imizi açıyoruz  
   InputStream myInput = myContext.getAssets().open(DB_NAME);
       // Yeni yaratılmış database’in pathini tam olarak algılıyoruz
   String outFileName = DB_PATH + DB_NAME;
   
   //Boş database’imizi açıyorz
      OutputStream myOutput = new FileOutputStream(outFileName);
  
   //Local database’imizi boş database üzerine kopyalıyoruz.
      byte[] buffer = new byte[1024];   
   int length;  
   while ((length =myInput.read(buffer))>0){
            myOutput.write(buffer, 0,length);  
   }  
   //Açılmış database’leri kapatıyoruz.  
   myOutput.flush();  
   myOutput.close();
  myInput.close();
    }

Sırasıyla , kod içinde de yazılan yorumlardan anlaşılacağı üzere, local database’imizi ve boş database’imizi açıp,kopyalama işlemini gerçekleştiriyoruz.Ardından da bu database’leri kapatıyoruz.


public void openDataBase() throws SQLException{   
   //Database’i Aç      
String myPath = DB_PATH + DB_NAME;  
   myDataBase = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READONLY);
  
}

Database’imize ulaşmamızı sağlayacak open metodunu yazıyoruz. Burada anlaşılmayan bir şey yok diye düşünüyorum.


@Override
       public synchronized void close() {
           if(myDataBase != null)
       myDataBase.close();  
       super.close();
       }

Aynı şekilde database üzerinde istenmeyen işlemlerin yapılmasını ya da dikkatsizlikten oluşacak hataları önlemekte kullanacağımız close metodunu da yazıyoruz. Yine burada anlaşılmayan bir şey yok diye düşünüyorum.


@Override
       public void onCreate(SQLiteDatabase db) {
       }
       @Override
       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       }

SQLiteOpenHelper sınıfını kullandığımızda zorunlu olarak yazmamız gereken metodları da ekliyoruz. Ama biz external bir database kullandığımız için bu metotlarla yapacağımız bir iş yok. İçlerini boş bırakıyoruz.


Cursor getAllAccounts()
         {
          this.close();
          this.openDataBase();
          SQLiteDatabase db=this.getReadableDatabase();
          Cursor cur=db.query("accounts", new String[] {"name"}, null , null , null , null , null);
          return cur;
         }


Bu illa kullanılması gereken bir metot değil. Yani kişiye,programa özel bir metot. Ben database’im içinde bulunan “accounts” tablosu içinden “name” kolonunda bulunan değerleri getirmek istediğim için , böyle bir metot oluşturdum. Burada , okunabilir bir database örneği çağırdıktan sonra query metodu ile sorgumu gerçekleştirdim. Dönen sonucu bir cursor üzerine atadım. Daha sonra activity içerisinden bunu çağırıp, istediğim gibi dönen verileri kullanacağım.



import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

Aslında tüm DatabaseHelper dosyamız bu kadar, ama hala hata alanlar varsa diye tüm importları da belirteyim istedim. Son satırdaki Log’u import etmeseniz de olabilir. Ben onu hatam nerede var, program nasıl işliyor diye görmek için LogCat üzerinde mesaj alabilmek için kullandım.


@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     
setContentView(R.layout.main);
        //DatabaseHelper sınıfından yeni bir örnek oluşturma
       
DatabaseHelper myDbHelper = new DatabaseHelper(this);
        myDbHelper = new DatabaseHelper(this);
      
//Database yaratma
        try {
             myDbHelper.createDataBase();
       } catch (IOException ioe) {
             throw new Error("Unable to create database");
       }
      
//Database açma
       try {
             myDbHelper.openDataBase();
       }catch(SQLException sqle){
             throw sqle;
       }
ListView listContent = (ListView)findViewById(R.id.contentlist);
Cursor cursor = myDbHelper.getAllAccounts();
    startManagingCursor(cursor);
    String [] values = new String [5] ;
   int i= 0;
  
while(cursor.moveToNext())
  {
      values[i] =cursor.getString(cursor.getColumnIndex("name"));
      i++;
    }
    cursor.close();
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, values);   
listContent.setAdapter(adapter);
    }           
    }


Activity dosyamız içinde yaptığımız şey, yeni bir database örneği yaratmak , bunu açmak , cursor üzerine accounts tablosundaki name kolonundaki verileri atmak ve bunları listview üzerinde göstermek. Hepsi bu.

Burada string array oluştururken boyutuna 5 verdim , çünkü geriye 5 tane verinin döneceğini biliyorum. Siz de size uygun olan bir boyutta array yaratmayı unutmayın. Yoksa hata alırsınız.

Görüntü ise şöyle oluyor. Hepsi empty olarak gözüküyor. Çünkü accounts tablomda name kolonu altında 5 tane empty yazıyor J



Sonuç olarak,Aykut Çayır’a, debug yapıp beni hatalardan kurtardığı için ve buradaki yazıyı yazana teşekkürü bir borç bilirim.

Biraz aceleye geldi yazı, eğer hatam,eksik aksağım varsa biri he desin. Ben de düzelteyim.