XE5 FireMonkey ile Mobil Uygulamada (Android ve iOs) SQLite Veritabanı Kullanımı

Tekrar sizlerleyim hem de sık sık lazım olacak bir şey ile, SQLite veritabanıyla Mobil uygulama yazmak. Veritabanı uygulamaları yazılım konusunda bir çok yerde karşımıza çıkıyor ve bizim işimizi gerçekten de kolaylaştırıyor.

Öncelikle SQLite veritabanına biraz değineceğim. SQLite masaüstü yazılımlarında taşınabilirliğiyle öne çıkarken, mobil piyasada da epey işimizi kolaylaştırıyor. Malum Android de iOs da veritabanı desteği olarak çok çok kısıtlılar. SQLite’ın desteklenmesi bize sağlanan büyük bir artı. Maalesef MSSQL ile yarışacak kadar çok güçlü bir veritabanı değil SQLite. Ancak mobil piyasada küçük çaplı projelerde işimizi görecektir. Zaten büyük ve orta çaplı projelerde cihazda veri tutmayı da desteklenen veritabanlarını da pek güvenilir bulmuyorum. Bu yüzden bir sunucuya MSSQL gibi bir veritabanı kurmalı ve web servisler aracılığıyla uygulamaya veri taşınmalı.

Sözü fazla uzatmadan SQLite’ın kullanımına geçeceğim. Bu yazımda anlatacağım yöntem RAD Studio’nun yeniliklerinden olan LiveBindings Designer ve bize sağladığı Data Explorer veritabanı bağlantı arayüzü üzerinden olacak. Yani bu yöntemle neredeyse hiç kod yazmadan veritabanı bağlantısı yapacağız. Aslında burada şunu da açıkça belirtmeliyim, TListView bileşeni kullanacağım ancak bu bileşen gerçekten rezalet performans sunan bir bileşen. Bunun için alternatif yöntemlerim var. Onları kesin olarak sonuçladığım zaman onlarla ilgili de yazı yazacağım.

Data Explorer penceresinden SQLite’a sağ tıklayıp “Add New Connection” diyoruz.
01

Sonrasında gelen pencereden bağlantımıza bir isim veriyoruz.
02
Ben Embarcadero’ın verdiği örneği aynen uyguladığım için alışveriş listesi uygulaması yapmaktayım. “ShoppingList” diye isimlendirdim.

OK dedikten sonra gelen pencerede Database kısmına veritabanı için bir yer tam isimle belirtin.
03

Sonrasında Advanced butonuna tıklayıp açılan pencerede FailIfMissing property’sini False olarak değiştirin.
04
(Bu seçeneği False yapmanız durumunda belirttiğiniz yerde veritabanı dosyası yoksa oluşturacaktır, bu yüzden yer belirtirken var olmasına gerek yok oluşmasını istediğimiz yeri belirtmek yeterli olacaktır.) OK diyip Modify Connection penceresine dönüyoruz ve Test Connection diyoruz.
05
Bu esnada yoksa zaten oluşacaktır veritabanı dosyamız. Ancak şunu da belirtmekte fayda var işletim sisteminize bağlı olarak sqlite3.dll bulunamadı hatası alabilirsiniz. Eğer bu hatayı alırsanız dll dosyasını http://www.sqlite.org/download.html adresinden temin edebilirsiniz.

Veritabanımızı tanımladık/oluşturduk. Sıra geldi tablomuzu oluşturmaya. ShoppingList diye isimlendirdiğimiz veritabanının adına çift tıklayıp menüyü uzatıyoruz. Tables’a sağ tıklayıp “New Table” diyoruz.
06

Tek bir alan ekliyoruz adı ShopItem veri tipi TEXT olacak şekilde.
07

Save (Kaydet) butonuna tıklayıp tablo adına Item diyoruz. Böylelikle kullanacağımız tablo da artık hazır.
08

Şimdi ise forma TToolbar ekleyip onun içine şunları ekliyoruz:

Toolbar içine 2 adet TButton koyup propertylerini şöyle değiştiriyoruz;

1. Button:
Name:=’ButtonAdd’;
StyleLookup:=addtoolbuttonbordered;

2. Button:
Name:=’ButtonDelete’;
StyleLookup:=deletetoolbutton;
Text:=’Sil’;
Visible:=False;

Toolbar içine TLabel koyup propertylerini şununla değiştiriyoruz;
Align:=alClient;
StyleLookup:=toollabel;
Text:=’Alışveriş Listesi’;
TextAlign:=taCenter;

Forma TListBox ekleyip Align:=alClient; yapıyoruz.

Form tasarımımız buna benzeyecek:
09

Form tasarımımız da tamam. Artık veri bağlantılarını tamamlama zamanı. Data Explorer’dan Item tablomuzu sürükleyip forma bırakıyoruz.
10

Bunu yapınca 2 tane bileşen oluşacak formumuzda.
11
(ShoppingList:TSQLConnection ve Item:TSQLDataSet)

ShoppingList bileşenini seçip Connected:=True; yapıyoruz.
Item bileşenini seçip Active:=True; yapıyoruz.
View>LiveBindings Designer menüsünü izliyoruz. LiveBindings Designer açılacak.
LiveBindings Designer’dan Item bileşen kutusundaki ShopItem’ı tutup ListBox1 bileşen kutusundaki Item.Text’in üzerine bırakıyoruz.
12
Bu adımlar sayesinde bağlantıyı da hallettik.

ListBox1’in ItemClick olayına şu kodu yazıyoruz:

procedure TForm1.ListBox1ItemClick(const Sender: TCustomListBox;
  const Item: TListBoxItem);
begin
  ButtonDelete.Visible := ListBox1.Selected <> nil;
end;

Bu sayede listeden bir şey seçmedikçe sil butonumuz görünmeyecek.

Şimdi de ekle butonumuzla kayıt ekleyelim.
Forma 1 adet TSQLQuery ekliyoruz.
Property’lerini şöyle ayarlıyoruz:
Name:=’SQLQueryInsert’;
SQLConnection:=ShoppingList;
SQL:=’INSERT INTO ITEM (ShopItem) VALUES (:ShopItem)’;
Params Property’sinin yanındaki […] butonuna tıklıyoruz.
ShopItem parametresini seçip DataType:=ftString; yapıyoruz.
13

ButtonAdd bileşenimizin onClick olayına şu kodu yazıyoruz:

procedure TForm1.ButtonAddClick(Sender: TObject);
var
  TaskName: String;
begin
  try
    if InputQuery('Enter New Item', 'Name', TaskName) and (TaskName.Trim <> '') then
    begin
      SQLQueryInsert.ParamByName('ShopItem').AsString := TaskName;
      SQLQueryInsert.ExecSQL();
      Item.Refresh;
      ButtonDelete.Visible := ListBox1.Selected <> nil;
    end;
  except
    on e: Exception do
    begin
      ShowMessage(e.Message);
    end;
  end;
end;

Kayıt ekleme ekran görüntüleri:
1415

Şimdi de kayıt silme işlemini yapalım. Forma tekrardan 1 adet TSQLQuery ekleyelim.
Property’lerini şu şekilde düzenliyoruz:
Name:=’SQLQueryDelete’;
SQLConnection:=ShoppingList;
SQL:=’delete from Item where ShopItem = :ShopItem’;
Params property’sinin yanındaki […] butonuna tıklıyoruz.
ShopItem parametresini seçip DataType:=ftString; yapıyoruz.
13

ButtonDelete bileşeninin onClick olayına şu kodu yazıyoruz:

procedure TForm1.ButtonDeleteClick(Sender: TObject);
var
  TaskName: String;
begin
  TaskName := ListBox1.Selected.Text;

  try
    SQLQueryDelete.ParamByName('ShopItem').AsString := TaskName;
    SQLQueryDelete.ExecSQL();
    Item.Refresh;
    ButtonDelete.Visible := ListBox1.Selected <> nil;
  except
    on e: Exception do
    begin
      SHowMessage(e.Message);
    end;
  end;
end;

Formun son hali de şuna benzeyecektir:
16

Uygulamamız bitti sayılır. Şimdi mobil ortamda çalışması için yapmamız gerekenleri yapacağız.

Bu etapta öncelikle kurulumda veritabanı dosyamızın da kurulmasını sağlayacağız. Bunun için Project>Deployment menüsünü izleyip Deployment Manager’ı açıyoruz. “Add Files” butonuna tıklayıp veritabanı dosyamızın bilgisayarımızdaki konumunu belirtiyoruz.
17
Dosyamız listeye eklenecek.

Listeden bulup Remote Path sütununu;
iOs için: StartUp\Documents\
Android için: assets\internal\
olarak değiştiriyoruz.
18
19

Platforms sütunundaki […] butonuna tıklayıp, hangi platform içinse sadece onu seçili bırakıyoruz.
Bunları da doğru olarak yaptığımızdan emin olduktan sonra devam ediyoruz.

Şimdi de veritabanı dosyasına mobilden bağlanmak için yerini belirten bir kod eklemesi yapacağız. Bunun için ShoppingList bileşeninin BeforeConnect olayına şu kodu yazıyoruz:

procedure TForm1.SQLConnectionSQLiteBeforeConnect(Sender: TObject);
begin
  {$IF DEFINED(iOS) or DEFINED(ANDROID)}
  ShoppingList.Params.Values['Database'] :=
      TPath.Combine(TPath.GetDocumentsPath, 'shoplist.s3db');
  {$ENDIF}
end;

Eğer tablomuz yoksa oluşturması için de şu kodu ShoppingList bileşeninin AfterConnect olayına ekliyoruz:

procedure TForm1.ShoppingListAfterConnect(Sender: TObject);
begin
  ShoppingList.ExecuteDirect('CREATE TABLE IF NOT EXISTS Item (ShopItem  TEXT NOT NULL)');
end;

Uygulamamız tamamdır. Artık derleyebiliriz. Buyrun bunlar da ekran görüntüleri:
2021

Bir sonraki yazıda görüşmek dileğiyle. Yorumlarınızı esirgemeyin. Sağlıklı ve esen kalın.

Tags: , , , , , , , , , , ,

20 Responses to “XE5 FireMonkey ile Mobil Uygulamada (Android ve iOs) SQLite Veritabanı Kullanımı”

  1. Aslan Akbey 28 Haziran 2015 at 12:57 #

    Elinize sağlık çok teşekkürler. Tüm adımları uygulayınca uygulama telefonda çalıştı. Ancak Telefondan veri girince, bilgisayardaki veri tabanı değişmedi. Bu uygulama telefonun içinde mi veri tabanı oluşturuyor.
    Teşk.

    • Ahmet Kürşat ÇAKIR 02 Temmuz 2015 at 01:45 #

      Tam olarak anlayamadım ama bilgisayardaki veritabanınız tabi ki değişmeyecektir. Telefonun içinde Android’in veya iOs’un kendine ait documents klasöründe veritabanı oluşturur.

  2. bilge sel 30 Ocak 2015 at 23:50 #

    Ustadim detayli anlatim icin elinize saglik. Musait zamanda harici bir veritabanına (ip ile mysql-mssql) nasil baglanabilecegimiz konusuna deginirseniz seviniriz. Kolay gelsin.

  3. güven 27 Kasım 2014 at 22:31 #

    ahmet hocam test connection bastığımda failed unable to open data file. hatası çıkıyor

    • Ahmet Kürşat ÇAKIR 02 Temmuz 2015 at 01:26 #

      Rad studio’yu yönetici olarak çalıştırmayı veya veritabanının bulunduğu klasöre “everyone” yetkilendirmesini yapıp denediniz mi?

  4. ali zahit çopur 31 Ağustos 2014 at 14:49 #

    merhaba ben dediklerinizi yapıyorum ama Modify Connection penceresinde test connection a tıkladığımda “failed unable to open database file” hatası alıyorum.

    • Ahmet Kürşat ÇAKIR 02 Temmuz 2015 at 01:34 #

      Rad studio’yu yönetici olarak çalıştırmayı veya veritabanının bulunduğu klasöre “everyone” yetkilendirmesini yapıp denediniz mi?

  5. Selcuk 18 Haziran 2014 at 03:27 #

    Merhaba,

    Örneği X6 ‘da denedim. Menülerin çoğu aynı fakat BeforeConnect ve afterConnect kodlarında hata veriyor o kodları çıkarınca derliyor. Neden olabilir?

  6. Yunus 14 Haziran 2014 at 12:25 #

    Emeğinize Sağlık Çok Yararlı Bir Çalıma Olmuş. Aynı Şekilde Sizden Birde Veri Tabanı İle Alakalı Server Uygulaması da Bekliyorum Bloğunuzu Takip Edeceğim. Teşekkürler

  7. Bayram Ali 06 Mart 2014 at 01:11 #

    merhaba
    ben asp.net de yazılan webservise baglanmak istiyorum.Yardımcı olur musunuz.

  8. Cihan YILDIRIM 18 Ocak 2014 at 22:29 #

    Bu yazı ile sqlite3.dll sorununu çözdüm. Mobil uygulamanın detaylarını öğrendim. Uygulama yazdım.

    Not: TPath.Combine için uses kısmına System.IOUtils eklemeyi unutmayın.

    Soru1 – Firefox > Sqlite Manager ile oluşturduğum tablolarda Rad Studio > Data Explorer > sqlite > Advanced seçeneğinde FailIfMissing çıkmıyor! Sizin yaptığınız gibi tablo eklediğimizde FailIfMissing seçeneği çıkıyor.

    Soru2: Benim bilgisayarım da ki sqlite veri tabanı dosya adlarının sonu *.sqlite siz de ise *.s3db bu bir fark yaratır mı?

    Ahmet Kürşat ÇAKIR detaylı yazın için Teşekkürler.

    • Ahmet Kürşat ÇAKIR 27 Ocak 2014 at 12:59 #

      1. Soruyu ele alırsak, oradaki parametreleri sonradan eklemek mümkün elle ekleyebilirsiniz. Olmadı bir de sqlite browser ile deneyin.
      2. Soru ise, veritabanı tasarlayıcıları farklı uzantılar verebiliyor. Bu sürümden de kaynaklanabiliyor, ancak sorun çıkartmaz. Hatta isterseniz kendiniz bir uzantı belirleyip onu da verebilir, uzantısız bile bırakabilirsiniz.

      Ben teşekkür ederim.

  9. Bayram Ali 06 Ocak 2014 at 22:10 #

    Merhaba
    blogunuzu takip ediiyorum , teşekkür ederim yazılaarınız için.
    Bu üst kısımda belirttiğiniz gibi sqlite3.dll bulunamadı hatası nsonrasında sitesinden indirdiğim .dll dosyasını bazı sayfalarda “C:\Windows\SysWOW64” şu dizine atın deniliyor öylede yaptım ama yine aynı hatayı alıyorum yardım edermisiniz?
    Çalışmalarınızda kolaylıklar diliyorum,iyi günler

  10. mustafa 01 Ocak 2014 at 20:37 #

    hocam mdb veritabanına nasıl bağlanılıyor xe5 androidte resimli örnek verebilirmisiniz

    • Ahmet Kürşat ÇAKIR 07 Ocak 2014 at 20:04 #

      Maalesef ms access kullanamıyoruz. Yazıda anlatıldığı gibi SQLite kullanabilirsiniz. Veya web servis ile online olarak başka bir veritabanı kullanabilirsiniz.

Leave a Reply

*