31 Ocak 2023 Yazarı yhackup 2

Delphi & Firebase Database Entegrasyonu Nasıl Sağlanır ?

Merhabalar,

Bu yazıda , Delphi Projenize Google Firebase Database Entegrasyonunu nasıl yapacağınızdan bahsedeceğim.

Firebase Google Amcanın bize sunduğu çok güzel kısmi ücretsiz, harika özellikler barındıran bir proje, biz bu yazımızda Realtime Database özelliğini kullanacağız.

Realtime Database aylık 10GB veriye kadar ücretsizdir , bu sebebten basit projelerinizde ücretsiz olarak bu canlı veritabanından neden yararlanmayalım.

İşimize Google Firebase Database oluşturmakla başlayacağız , öncelikle aşağıdaki linkten yeni bir proje oluşturalım.

https://console.firebase.google.com

Resimler ile nasıl yapabileceğinizi adım adım gösterelim..

İlk adım yeni proje oluşturma




Projemiz oluşturuldu ve kullanma hazır.

Şimdi veritabanı oluşturuyoruz.

Resimler ile devam…


İlk olarak public şekilde ayarlayabiliriz , sonradan kilitli moda alabiliriz.

Public şekilde olsa da Database Key olmadan kimse verilerini okuyamaz değiştiremez.  Test modunda olması verilerinizi herkesin görebileceği anlamına gelmiyor yani bu konuya daha sonra detaylı değinirim.

Bildiğiniz üzere Google amcanın bir çok ülkede Server’leri var , burada sizden bir bölge seçmenizi istiyor, size en yakın bölgeyi seçmeniz hız bakımından avantaj sağlayacaktır.

Sizin bu seçeneği değiştirmenize gerek yok google amca size en uygun bölgeyi kendisi otomatik seçiyor zaten.

Yukarıda Bitti dedikten sonra, size database ekranını açacak.

Bizim şimdi database’in secret keyine ve databaseurl’sine ihtiyacımız var.

Google her proje için bir domain verir bizlere, buna databaseurl denir.

Yukarıdaki gibi Ayarlar simgesine, daha sonra Kullanıcı  ve İzinler butonuna tıklıyoruz.

Açılan pencerede, Hizmet Hesapları sekmesine gelerek , Veritabanı Gizli Anahtarı Sekmesine tıklayın, Aşağıdaki gizli anahtarı alarak bir kenara kaydedin.

Sırada ihtiyacımız olan, Database Url’i almak için yukarıdaki gibi Uygulama ekliyoruz ,

Uygulamanıza isim verin ve devam edin.

Google SDK’mızı ayarlayıp bize Database Url’imizi verdi , şimdi bunu da bir kenara kaydediyoruz.

Şimdi yeni bir Koleksiyon başlatmamız gerekiyor, bir tablo adı gibi düşünebilirsiniz.


Buraya Doğrudan Otomatik Kimlik butotuna tıklayarak kaydedin.

Database’imiz hazır diyebiliriz, buradan sonra tablo fieldleri ayarlamanıza gerek yok , buraya nasıl bir json post ederseniz otomatik o şekilce bir tablo oluşacaktır.

Database’imizde şu işlemleri yapabiliriz.

  • Post (Insert Data – Veri Kaydetme)
  • Put (Update Data – Veri Güncelleme)
  • Delete (Delete Data – Veri Silme) 
  • Get (Get Data – Veri Listeleme / Gösterme) 

Sırasıyla bu işlemleri yapacağız.

Örneğin delphi versiyonlarını saklayacağımız bir veritabanı olsun bu.


Minik bir Delphi uygulaması ile gösterelim , bu uygulamanın kodlarını ve Kaynak Dosyasını yazının en sonunda sizlerle paylaşacağım.

Request Body’de gördüğünüz json verisini, Yukarıda açtığımız DelphiDb.json database’mizie post ettiğimizde canlı olarak verimizin kaydolduğunu Realtime database menüsünden gözlemleyebiliyoruz.

Ve Realtime Database sekmesinden izlediğimizde post eder etmez  , verimizi benzersiz uniqe bir ıd ile kaydolduğunu gözlüyoruz ve response olarak bize bu benzersiz id’yi dönüyor veritabanımız.

Sırasıyla 4 versiyonu database’imize bu şekilde kaydettik.

Buradan sonrasını video ile göstermem daha iyi olur sanırım.

aşağıdaki video’dan yukarıdaki 4 işlemi canlı olarak nasıl gerçekleştirdiğimi görebilirsiniz.

https://www.youtube.com/watch?v=9WUl6R_bYGw

Delphi Proje Dosyasını indirmek için tıklayın

Proje Dosyası Kodları

FirebaseDatabase.pas


Delphi/Pascal

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142   unit FirebaseDatabase; interface uses  System.Classes, clHttp, clHttpRequest, System.SysUtils; type  TFirebase = class(TObject)  public    SecretKey: String;    ProjectUrl: String;    procedure Delete(Database: string);    procedure Put(Database, Data: string);    function Post(Database, Data: string): String;    function Get(Database: string): String;  end; implementation { TFirebase } procedure TFirebase.Delete(Database: string);var  FireBase: TclHttp;begin  FireBase := TclHttp.Create(nil);  try    // Post Url :  https://delphifirebase-demo.firebaseio.com/DelphiDb/-Lmnhs0f6jE22p2H_Jz4.json?auth=guPhITQseHczlGqZgG6CnNTV2nqY1n7gfccX2NlO    FireBase.Delete(ProjectUrl + Database + ‘?auth=’ + SecretKey);  finally    if Assigned(FireBase) then      FreeAndNil(FireBase);  end;end; function TFirebase.Get(Database: string): String;var  Response: TMemoryStream;  FireBase: TclHttp;  Ts: TStringList;begin  Response := TMemoryStream.Create;  FireBase := TclHttp.Create(nil);  Ts := TStringList.Create;  try    // Post Url :  https://delphifirebase-demo.firebaseio.com/DelphiDb.json?auth=guPhITQseHczlGqZgG6CnNTV2nqY1n7gfccX2NlO    FireBase.Get(ProjectUrl + Database + ‘?auth=’ + SecretKey, Response);    Response.Position := 0;    Ts.LoadFromStream(Response, TEncoding.UTF8);    Result := Ts.Text;  finally    if Assigned(Ts) then      FreeAndNil(Ts);     if Assigned(Response) then      FreeAndNil(Response);     if Assigned(FireBase) then      FreeAndNil(FireBase);  end;end; function TFirebase.Post(Database, Data: string): String;var  Response: TMemoryStream;  FireBase: TclHttp;  Ts: TStringList;  Request: TclHttpRequest;  SStream: TStringStream;begin  Response := TMemoryStream.Create;  FireBase := TclHttp.Create(nil);  Ts := TStringList.Create;  Request := TclHttpRequest.Create(nil);  SStream := TStringStream.Create(Data);  try    Request.RequestStream := SStream;    Request.Header.ContentType := ‘application/json’;    Request.Header.ContentLength := IntToStr(SStream.Size);    // Post Url :  https://delphifirebase-demo.firebaseio.com/DelphiDb.json?auth=guPhITQseHczlGqZgG6CnNTV2nqY1n7gfccX2NlO    // Post Data : {“Product”: “Delphi 10.3 Rio”,”ProductVersion”: 26,”PackageVersion”: 260,”CompilerVersion”: 33}    FireBase.Post(ProjectUrl + Database + ‘?auth=’ + SecretKey, Request, Response);    Response.Position := 0;    Ts.LoadFromStream(Response, TEncoding.UTF8);    Result := Ts.Text;  finally    if Assigned(Ts) then      FreeAndNil(Ts);     if Assigned(Response) then      FreeAndNil(Response);     if Assigned(FireBase) then      FreeAndNil(FireBase);     if Assigned(Request) then      FreeAndNil(Request);     if Assigned(SStream) then      FreeAndNil(SStream);  end;end; procedure TFirebase.Put(Database, Data: string);var  Response: TMemoryStream;  FireBase: TclHttp;  Request: TclHttpRequest;  SStream: TStringStream;begin  Response := TMemoryStream.Create;  FireBase := TclHttp.Create(nil);  Request := TclHttpRequest.Create(nil);  SStream := TStringStream.Create(Data);  try    Request.RequestStream := SStream;    Request.Header.ContentType := ‘application/json’;    Request.Header.ContentLength := IntToStr(SStream.Size);    // Post Url :  https://delphifirebase-demo.firebaseio.com/DelphiDb/-Lmnhs0f6jE22p2H_Jz4.json?auth=guPhITQseHczlGqZgG6CnNTV2nqY1n7gfccX2NlO    // Post Data : {“Product”: “Delphi 10.3 Rio”,”ProductVersion”: 26,”PackageVersion”: 260,”CompilerVersion”: 33}    FireBase.Put(ProjectUrl + Database + ‘?auth=’ + SecretKey, ‘application/json’, Request.RequestStream);  finally    if Assigned(Response) then      FreeAndNil(Response);     if Assigned(FireBase) then      FreeAndNil(FireBase);     if Assigned(Request) then      FreeAndNil(Request);     if Assigned(SStream) then      FreeAndNil(SStream);  end;end; end.  

Main.pas


Delphi/Pascal

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172   unit Main; interface uses  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,  FirebaseDatabase, Vcl.ExtCtrls, Data.DB, Vcl.Grids, System.JSON, Vcl.DBGrids, dxmdaset, Vcl.DBCtrls; type  TMainForm = class(TForm)    GroupBox1: TGroupBox;    PageControl1: TPageControl;    Post: TTabSheet;    Put: TTabSheet;    Delete: TTabSheet;    Get: TTabSheet;    GroupBox2: TGroupBox;    SecretKey: TLabeledEdit;    ProjectUrl: TLabeledEdit;    Post_Button: TButton;    GroupBox3: TGroupBox;    GroupBox4: TGroupBox;    RequestBody: TMemo;    ResponseBody: TMemo;    Panel1: TPanel;    CollectionName: TLabeledEdit;    Get_Button: TButton;    CollectionName2: TLabeledEdit;    GroupBox5: TGroupBox;    ResponseBody2: TMemo;    DBGrid1: TDBGrid;    DataSource1: TDataSource;    dxMemData1: TdxMemData;    Button1: TButton;    dxMemData1Product: TStringField;    dxMemData1ProductVersion: TIntegerField;    dxMemData1PackageVersion: TIntegerField;    dxMemData1CompilerVersion: TIntegerField;    dxMemData1DatabaseId: TStringField;    Delete_Btn: TButton;    Update_Btn: TButton;    GroupBox6: TGroupBox;    RequestBody3: TMemo;    CollectionName3: TLabeledEdit;    Put_btn: TButton;    DataKey: TLabeledEdit;    CollectionName4: TLabeledEdit;    dataKey2: TLabeledEdit;    Delete_Button: TButton;    procedure FormCreate(Sender: TObject);    procedure Post_ButtonClick(Sender: TObject);    procedure Get_ButtonClick(Sender: TObject);    procedure Button1Click(Sender: TObject);    procedure dxMemData1BeforeDelete(DataSet: TDataSet);    procedure Update_BtnClick(Sender: TObject);    procedure Put_btnClick(Sender: TObject);    procedure Delete_ButtonClick(Sender: TObject);    procedure Delete_BtnClick(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  MainForm: TMainForm;  Firebase: TFirebase; implementation {$R *.dfm} procedure TMainForm.Get_ButtonClick(Sender: TObject);begin  Firebase.SecretKey := SecretKey.Text;  Firebase.ProjectUrl := ProjectUrl.Text;  ResponseBody2.Text := Firebase.Get(CollectionName.Text);end; procedure TMainForm.Post_ButtonClick(Sender: TObject);begin  Firebase.SecretKey := SecretKey.Text;  Firebase.ProjectUrl := ProjectUrl.Text;  ResponseBody.Text := Firebase.Post(CollectionName.Text, RequestBody.Text);end; procedure TMainForm.Put_btnClick(Sender: TObject);begin  Firebase.SecretKey := SecretKey.Text;  Firebase.ProjectUrl := ProjectUrl.Text;  Firebase.Put(CollectionName3.Text + ‘/’ + DataKey.Text, RequestBody3.Text);end; procedure TMainForm.Update_BtnClick(Sender: TObject);var  JSON: String;begin  JSON := Format(‘{“Product”: “%s”,”ProductVersion”:%s,”PackageVersion”: %s,”CompilerVersion”: %s}’,    [dxMemData1Product.AsString, dxMemData1ProductVersion.AsString, dxMemData1PackageVersion.AsString, dxMemData1CompilerVersion.AsString]);  RequestBody3.Text := JSON;  DataKey.Text := dxMemData1DatabaseId.AsString + ‘.json’;  PageControl1.ActivePageIndex := 2;end; procedure TMainForm.Button1Click(Sender: TObject);var  ListObject: TJSONObject;  item: TJSONObject;  JsonValue, DatabaseId: String;  i: integer;begin  dxMemData1.DisableControls;  ListObject := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(ResponseBody2.Text), 0) as TJSONObject;  try    for I := 0 to ListObject.Count – 1 do    begin      JsonValue := ListObject.Pairs[i].JsonValue.ToString;      DatabaseId := ListObject.Pairs[i].JsonString.Value;      item := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(JsonValue), 0) as TJSONObject;      try        if not dxMemData1.Active then          dxMemData1.Open;        dxMemData1.Edit;        dxMemData1.Append;        dxMemData1.FieldByName(‘DatabaseId’).Value := DatabaseId;        dxMemData1.FieldByName(‘Product’).Value := item.GetValue(‘Product’).Value;        dxMemData1.FieldByName(‘ProductVersion’).Value := item.GetValue(‘ProductVersion’).Value;        dxMemData1.FieldByName(‘PackageVersion’).Value := item.GetValue(‘PackageVersion’).Value;        dxMemData1.FieldByName(‘CompilerVersion’).Value := item.GetValue(‘CompilerVersion’).Value;        dxMemData1.Post;      finally        FreeAndNil(item);      end;    end;   finally    if Assigned(ListObject) then      FreeAndNil(ListObject);  end;  dxMemData1.EnableControls;end; procedure TMainForm.Delete_BtnClick(Sender: TObject);begin  CollectionName4.Text := ‘DelphiDb’;  dataKey2.Text := dxMemData1DatabaseId.AsString + ‘.json’;  PageControl1.ActivePageIndex := 3;end; procedure TMainForm.Delete_ButtonClick(Sender: TObject);begin  Firebase.SecretKey := SecretKey.Text;  Firebase.ProjectUrl := ProjectUrl.Text;  Firebase.Delete(CollectionName4.Text + ‘/’ + dataKey2.Text);end; procedure TMainForm.dxMemData1BeforeDelete(DataSet: TDataSet);begin  ShowMessage(DataSet.FieldByName(‘DatabaseId’).AsString);end; procedure TMainForm.FormCreate(Sender: TObject);begin  Firebase := TFirebase.Create;end; end.