XE5 Mobil Uygulamada SQLite Veritabanı kullanımı
Merhabalar, Biraz sonra baslayacağımız örnekte XE5 Android üzerinden manuel olarak kod ile sqlite bağlantı, silme, ekleme ve listvievin otomatik yenilenmesi islemlerini göreceğiz. Bu işlemi gerçekleştirmek için birçok yöntem vardır ve ben XE5'in bize sunduğu FireDAC aracılığı ile yapacağım. İnternette XE5 hakkında türkçe çok sıkıntılı oldugu için bende kendi çerçevemde yapabildiğim kadar bütün yazılarımda buna değinmeye çalışacağım. Projemize baslangıçta resimde göreceğiniz üzere: 1 Toolbar 3 buton 1 listviev ekliyoruz ve tasarımını istersek resimdeki gibi yapabilirsiniz devam ediyoruz.
Bilmeyen arkadaslar için butonların native android iconlarını almalari için, butona tıklayıp soldaki Object Inspector'den StyleLookup içerisinden seçmeleri gerekmektedir. Sıradaki ekleyeceğimiz elemanlar veritabanı bağlantısı için: 1-)FDConnection 2-)FDQuery 3-)BindingsList 3-)BindSourceDB 3-)FDPhysSQLiteDriverLink 3-)FDGUIxWaitCursor Bir sorun çıkmasına karşın Uses bloğumu da yazıyorum eksiklerinizi tamamlayabilirsiniz.
uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, Data.DB, Data.SqlExpr, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Comp.Client, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.DataSet, FMX.Layouts, FMX.ListBox, Data.Bind.Components, Data.Bind.DBScope, FireDAC.Stan.ExprFuncs, FireDAC.Phys.SQLite, FireDAC.FMXUI.Wait, FireDAC.Comp.UI, FMX.Platform.Android, FMX.ListView.Types, FMX.ListView, DateUtils, System.Rtti, System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.EngExt, Fmx.Bind.DBEngExt, FMX.Edit;Sıradaki ekleyeceğimiz elemanlar veritabanına kayıt için işlemi: 2 adet panel ve her birinin içine 1 tane label ve 1 tane edit ekliyoruz ve asağıdaki görüntüdeki gibi bir şekil yapabilirsiniz.
Benim kişisel tavsiyem kod yazarken kafanızın karışmaması için eklediğiniz ve sık kullanacağınız bileşenlerin isimlerini olduğu gibi bırakmamanızdır. Şimdi kod yazımına geçiyoruz ve ilk yapacağımız ise USES kısmına "System.IOUtils" kütüphanesini ekleme sebebi ise manuel oluşturacağımız sqlitenin yerini ayarlamak için. Veritabani bağlantı işlemi için sol üsteki bağlan butonuna : Var blogumuza 2 adet değişken tanımlayacağız
Var LFCF : TLinkFillControlToField; // Listviewin Veritabanına bağlanması için gerekli DbYol : String; // manuel olusturacağımız sqlitenin yerini ayarlamak içinBegin blogunun altından başlayarak öncelikle veritabanı yolumuzu Dbyol değişkenine kaydediyoruz.
DbYol := System.IOUtils.TPath.GetDocumentsPath + PathDelim + 'SqliteDers.s3db'; // Burada yanlış hatırlamıyorsam uygulamamız ile aynı dizine kayıt yolu belirtiyordukSırada Connectionumuzun ayarları var:
With FDConnection1 do begin LoginPrompt := False; Params.Clear; Params.Values['Database'] := DbYol; // yukarıda belirttiğimiz kayıt dizini Params.Values['DriverID'] := 'SQLite';// veritabanı türümüz Params.Values['CharacterSet'] := 'utf8'; // yazı karakteri türü Connected := True; // bağlantımızı aktif yaptık // Yoksa SQL veritabanı kendiliğinden otomatik olarak CREATE edilmiş olacaktır... end;Veritabanını oluşturduğumuza göre tablomuzu oluşturma evresine geçebiliriz:
With FDQuery1 do begin Active := False; // Aktif olma olasılığına karşı kapatılıyor. // DERS adında tablomuz yoksa baştan yaratıyoruz buranın içerigi size kalmış. Connection := FDConnection1; SQL.Clear; SQL.Add( 'CREATE TABLE IF NOT EXISTS DERS (' ); SQL.Add( ' ADI nvarchar(10)'); SQL.Add( ' );'); ExecSQL; //Tablo yaratma işlemi tamamlandı. // Listviewe bağlanacak querymizin sql içeriğini nasıl bir listeleme yapmak istiyorsak ona göre ayarlıyoruz SQL.Clear; SQL.Add( 'SELECT'); SQL.Add( ' ADI' ); SQL.Add( ' FROM DERS' ); Active := True; // ListBox'a Bind etmek için hazırlık... // BindSurceDB1 bu sayede Fieldlari görür. // DetailFields := 'Adi;Soyadi'; end;Sırada en önemli yeri olan listview'in binding ayaları var:
ListView1.BeginUpdate; //Listview yükleme işlemine başlatılıyor BindSourceDB1.DataSet := FDQuery1; while BindingsList1.BindCompCount > 0 //Aynı butona 1'den fazla basılırsa diye do BindingsList1.BindComps[0].Free; LFCF := TLinkFillControlToField.Create(nil);//köprü bağlantı için Linkfillcontrol nesnemizi oluşturuyoruz With LFCF do //Nesnemiz manuel olduğu için Object inspectorünü buradan ayarlıyoruz. begin Control := ListView1; FillDataSource := BindSourceDB1; FillDisplayFieldName := 'ADI'; Category := 'Quick Bindings'; AutoFill := True; AutoActivate := True; end; BindingsList1.InsertComponent( LFCF );//Bindigslistin baz alacağı LinkFill'i gösterdik LFCF.Free; // Artık objemizi serbest bırakabiliriz FDQuery1.Active := False; FDQuery1.Active := True; ListView1.EndUpdate //yükleme işlemi tamamlandı.Bağlantı butonu ile işimiz bittiğine göre artık kayıt ve silme işlemine geçebiliriz. Kayıt butonumuza:
With TFDQuery.Create(nil) do //Sanal bir FireDAC Query oluşturuyoruz. begin Connection := FDConnection1; //Verıtabanı bağlantısını ayarlıyoruz. SQL.Clear; SQL.Add( 'INSERT INTO DERS ' ); //Buradaki "DERS" kullandığımız tablonun adı. SQL.Add( '( ADI )' ); //Buradaki "ADI" alanımızın adı. SQL.Add(' VALUES ' ); SQL.Add(' (:d0) '); //Rahat olması bakımından parametre ile yapılmıştır bu örnekte. Params[0].Value := Aditxt.Text; //editin değerini parametremize eşitliyoruz. ExecSQL; //ExecSQL geri dönüsü olmayan sorgular için kullanılır INSERT DELETE gibi. Free; //Artık query ile işimiz bittiğine göre serbest bırakabiliriz. end; FDQuery1.Active := False; //Yapılan değişikliklerin gözükmesi için query i kapatıyoruz. FDQuery1.Active := True; //Yapılan değişikliklerin gözükmesi için query i açıyoruz.Şöyle bir bakılınca Ekle butonumuzdan yapı olarak pek bir farkı yoktur yine parametre göndereceğiz sadece burada sql sorgusunu değiştirecegiz. Sil butonumuza:
With TFDQuery.Create(nil) do //Sanal bir FireDAC Query oluşturuyoruz. begin Connection := FDConnection1; //Veritabanı bağlantısını ayarlıyoruz. SQL.Clear; SQL.Add( 'Delete From DERS Where ADI = ' ); //Buradaki "DERS" kullandığımız tablonun ve "ADI" yazanda kolonun adı. SQL.Add( ' :d0 ' ); //Rahat olması bakımından parametre ile yapılmiştir bu örnekte. Params[0].Value := ListView1.Selected.Text; //listviewin seçilen elemanının değerini parametremize eşitliyoruz. ExecSQL; //ExecSQL geri dönüsü olmayan sorgular için kullanılır INSERT DELETE gibi. Free; //Artık query ile işimiz bittiğine göre serbest bırakabiliriz. end; FDQuery1.Active := False; //Yapılan değişikliklerin gözükmesi için query i kapatıyoruz. FDQuery1.Active := True; //Yapılan değişikliklerin gözükmesi için query i açıyoruz.İste bütün işlem bu kadar yapacağınız projeye göre bunları procedureler içine alıp istediğiniz şekilde kullanabilirsiniz. Yorumlarınzı esirgemeyin. Bu konularda Daha çok bulduğum kaynakları paylaşmaya devam edeceğim. Bu olayı kavramamda yardımcı olan ve bu güzel örneğini bizlere sunan Muharrem ARMAN (mrmarman) teşekkürler.
Teşekkürler Allah Razı olsun...Emeğine sağlık kardeşim..
YanıtlaSil