XamarinForms ile SQLite, MVVM ve DependencyService Kullanımı

Merhaba,

Bugün, sizlerden gelen mailler doğrultusunda Xamarin ile SQLite işlemlerini konu alan bir proje yapacağız.

Mobil platformlar üzerinde local bir veritabanına ihtiyaç duymuyor değiliz..

Bu gibi durumlarda yardımımıza SQLite koşuyor!
Aslında şunu söyleyebiliriz SQLite Mobil dünyanın kahramanlarından.

Bu örneğimizde proje tipimiz PCL olacak ve Xamarin Dependency servisleri kullanacağız.

Xamarin.Forms PCL

 Dependency Servis Nedir?

Xamarin.Forms uygulamaları geliştirirken platform spesifik yapmak istediğimiz işlemleri tek bir interface üzerinden oluşturmamızı ve gerçekleştirmemizi sağlar. Bu durum Xamarin.Forms üzerinde kod bağımlılığını teke indirmemizi de sağlamaktadır.

UWP

PCL projelerimizde UWP eklensin mi? sorusuna ben "Cancel" dedim. Siz isterseniz ekleyebilirsiniz.

SQLite.Net-PCL

SQLite.Net-PCL .dll'ini nuget ortamından projelerimize dahil ediyoruz.

ISQLite

Sizlerin de bildiği gibi cross-platform bir uygulama geliştiriyoruz ve gerekli bağlantı bilgimiz platformlara özel olduğu için bağlantı nesnemizin path ve platform özellikleri değişken olacaktır. Zaten bu yüzden Xamarin.Forms DependencyService'ini kullanacağız.

Platform özelindeki connection bilgilerini ISQLite interface'inden türemiş olan sınıflardan DependencyService yardımıyla alacağız.

SQLiteClient

Gerekli CRUD işlemlerimizin ve oluşturacağımız Student tablosunun olduğu SQLiteClient sınıfımız.

CreateTable işlemi çok kısa ve net bir şekilde çalışmaktadır. İçerisine verdiğiniz modeli tablo olarak açar ve işlemleri yapar. Eğer Student tipinde bir tablo varsa bir daha açmaz bu kontrolü SQLite.Net-PCL .dll'i kendisi yapmaktadır.

Buradaki lock objesine dikkat çekmek istiyoruz.

Lock nedir? Önce bunu açıklayalım..

Lock, C# programlama dilinde multi thread uygulamalarda thread güvenliğini sağlamak için kullanılan bir yoldur.

Kullanılan method veya eventlerinizde aynı anda sadece bir thread'in çalışmasını sağlamaktadır.

Bu yüzden SQLite objesi ile çalışırken thread güvenliğini sağlamamız gerektiği için lock objesini kullanmaktayız.

Android Dependency WinPhone Dependency

Droid ve WinPhone projelerimde gerekli Dependency sınıflarımı yazarak platform özelinde bağlantı bilgilerini aldım.

assembly tarafında, Xamarin.Forms Dependency için ISQLite interface'inden türemiş DroidConnection sınıfının çalışacağını garanti etmiş oluyorum.

Çünkü bağlantı bilgisini alırken, DependencyService.Get<ISQLite>().GetConnection(); ISQLite tipinden bir sınıfın bağlantı bilgisini vereceğini DependencyService'e söyledim.

Ben uygulamamı tek bir katmanda çalıştırıyorum fakat, SQLite bağlantı bilgisi hangi platformda çalışıyorsa ona özel gelecek.

Günün sonunda eğer Android ortamında çalışıyorsan DroidConnection, WinPhone ortamında çalışıyorsam WinPhoneConnection sınıflarım çalışacak.

WinPhone ortamında SQLite ile çalışırken yapmanız gereken 1-2 ek durum mevcut.

WinPhone SQLite

WinPhone projenizin referanslarına resimde gördüğünüz 2 .dll'i eklemeniz gerekmektedir.

Not: SQLite for Windows Phone 8.1 Visual Studio eklentisidir. Eğer sizden çıkmıyorsa indirip kurmanız gerekmektedir.

WinPhone SQLite

WinPhone 8.1 ortamına .dll'leri ekledikten sonra uyarı alırsanız.

WinPhone SQLite

Tools altındaki çalışma ortamını x86 yapmak zorundasınız.

Not: Güncelleme işlemini size bıraktım. Yapan ve github üzerinden fork atan kişi ile ortak bir örnek konu/proje yazmak isterim 🙂 Umarın yaparken eğlenirsiniz..

Proje'nin önemli noktalarına değindim, diğer detayları hakkında yazılarım ve uygulamalarım olduğu için konulardan bakabilirsiniz veya sorularınızı burdan sorabilirsiniz.

Github üzerinden ilgili projeyi indirip inceleyebilrisiniz. Xamarin.Forms ile SQLite, MVVM, DependencyService Kullanımı

Görüşmek üzere.

XamarinForms ile SQLite MVVM DependencyService Kullanımı XamarinForms ile SQLite MVVM DependencyService Kullanımı XamarinForms ile SQLite MVVM DependencyService Kullanımı XamarinForms ile SQLite MVVM DependencyService Kullanımı

 

Yiğit

Xamarin Developer, Consultant & Architect. Community Leader and Director of Xamarin Türkiye

4 Comments

You can post comments in this post.


  • Uzun süredir çalışmalarınızı takip ediyorum. Öncelikle paylaşımlarınız için teşekkürler. Bir sorum var, yanıtlarsanız çok sevinirim.
    Uygulamayı kullanan kişinin birden çok cihazdan uygulamayı kullanmak istiyorsa
    (örn:PC-windows10 ve Mobil:Android) bu durumda farklı cihazlardaki local bilgilerin senkronizasyonu konusunda önerebileceğiniz kolay bir yöntem var mı ?
    Cevabınız için şimdiden teşekkürler.

    ismail 7 sene ago Reply


    • İsmail selam,
      Local storage için SQLite kullanıyorsan ve senkronizasyon düşünüyorsan en kolay yöntem olarak direkt bir sync metodu ile ilgili webservisleri tetikletmek olur. Bunun yaninda Xamarin.Forms ile Connectivity Plugin ile online/offline kontrolu yapip buna gore arkada servis tetikletecek logic kisimlarini yazabilirsin.

      Yiğit 7 sene ago Reply


  • Merhaba,
    Dependency service’ ios ve androidde denedim Androidde sorunsuz çalışıyor ancak IOS ta interface’i referans alamıyorum bir türlü. Daha doğrusu portable katmanından hiçbir sınıfı ios tarafında referans alamıyorum. Bunun nedeni ne olabilir

    Teşekkürler,

    Betül 6 sene ago Reply


    • Selam,
      iOS tarafta projeni bir kere kapatip acman faydali olacaktir. (Acikdiktan sonra build etmeni tavsiye ederim.)

      Yiğit 6 sene ago Reply


Post A Reply