Xamarin Forms ile Local Storage Kullanımı [Bölüm 1]

Merhabalar,

bu yazımda sizlere Xforms da platfrom özelinde döküman saklama, silme ve görüntüleme üzerine çalışacağız.

Xamarin Forms da bildiğiniz üzere 2 farklı yöntem ile local dosyalarımızı görüntüleyebilmekteyiz. Bu yöntemler platform spesifik katmanda Assets,Resource altında olan dosyayı görüntüleme veya PCL ( Projenizin Portable) katmanda olan dosyayı görüntüleme şeklindedir. Fakat tahmin edeceğiniz üzere uygulamamızı yayımlamadan önce bu dosyaları projemize eklememiz gerekmektedir.Peki daha sonra API request ile gelmesi kullanıcı özelindeki image,pdf vb dokümanları nasıl saklayıp görüntüleyebiliriz?

Veriyi her seferinde request ile çekip view etmek çok küçük kb lik verileri saklamak yerine kısa vadede bir çözüm sağlayacaltır. Fakat bu çözüm bile veri ne kadar küçük olursa olsun doğru bir yaklaşım mıdır ? Örneğin hiç bir request işlemi olmadan açılışta kaydedilmiş kullanıcının avatarı gelmesi yerine request ile çekmek mantıklı mıdır?

Uzunca bir girişten sonra 256mb lık hafıza kartlarının yerini 256 gb lık hafızalı telefonların aldığı günümüzde bu bolluktan biz de fayda edelim ve verilerimizi localde saklama konusunu irdeleyelim.

Öncelikle mobilde local dosya işlemlerimizi yapmamız için gerekli olan “PCL Storage” paketini değerlimiz kıymetlimiz Nuget den indiriyoruz. PCL Storage bizlere mobilde IO işlemleri için kullanacağımız SystemIO apilerini sağlamaktadır.

Eğer URL üzerinden (bu api url üzerinden veya herhangi bir urlden) download edilip saklanacak bir veriniz var ise bu indirme işlemlerini gerçekleştirmekte bizlere yardımcı olacak olan “Microsoft.Net.Http” paketini ve bu paketin bağımlılıkları olan “BCL” vede “BCL Build” paketlerini indirmeliyiz. Benim yaklaşımında dosyayı indirmek için Microsoft Http yi kullandım siz daha aşına olduğunuz bir paketi de tercih edebilirsiniz.

Yükleme işlemini tamamladıktan sonra Portable katmanına Local ismiyle bir klasör yaratıp içerisine “IlocalFileInterface” adıyla bir interface yapıyoruz. Bunun içerisine Bir dosya kayıt etme ve okuma işlemlerinde kullanmamız gereken methodları ekleyeceğiz. Bu methodların listesi şu şekildedir.

 

–          CreateFolder (Tahmin edersiniz ki ortalık yere dosyamızı atacak halimiz yoktu😊 )

–          CreateFileFromString (Elimizdeki string değeri localde saklamak için kullanacağımız method)

–          SaveFileFromStream (Stream üzerinden dosyamızı kayıt edecek method)

–          FolderExists (Klasörün olup olmadığını kontrol edebilmek için)

–          FileExists (Dosyanın olup olmadığını kontrol edebilmek için)

–          ReadFileAsString (Kayıtlı string barındıran dosyayı okuyabilmek için)

Interface hazır gelelim işlemlerimizi yapacağımız Manager’ımızı yazmaya. Yine Portable katmanında bulunan Local klasörünün altına “LocalFileManager” adında classımızı oluşturuyoruz. LocalFileManagerımız IlocalFile interfaceni bazalacaktır. Daha sonra gelip tek tek methodlarımızı implemente edeceğiz.

CreateFolder

Öncelikle bir PCLStorage Ifolder oluşturuyoruz. İçerisine FileSystem in Current LocalStorage değerini atıyoruz.Burada Ifolder interfacenindeki işlemlerimizi cihaz spesifik localstrorage alanında yapacağımızı belirtiyoruz.

Daha sonra ise Ifolder’ın CreateFolder methodunu kullanarak klasörümüzü oluşturuyoruz.Burda klasör adını ve “Creation Collusion Option” belitrmemiz gerekiyor. Ben genelde OpenIfExists olarak kullanmaktayım. Buda bana eğer aynı isimde klasör var ise içerisinde veri kaybı yaşamadan veya yeni isimli bir seçenek (verilen klasör adı (2) şeklinde) ile dönmeden var olanı geri dönmektedir.

FolderExists ve FileExists

Runtime da dosya bulunamadığından hata almaması ve var olan dosyayı üzerine yazma gibi hatalardan kaçınmak için local storage da daha önceden bu dosyanın ve klasörün var yok kontrolünü yapmak çok önemli.

Klasör için bir Ifolder _rootfolder oluşturup. Bunun “CheckExistsAsync” methodu yardımıyla klasör adını verip klasörün varlığından emin oluyoruz. İşlemin sonucu size “ExistenceCheckResult” dönmektedir. Bunu da yine ExistenceCheckResult’ın FolderExists ‘i ile karşılaştırıp klasörün var olup olmadığının sonucuna ulaşabilirsiniz.

Dosya için bir ise aynı işlemleri yapıyoruz. Burdaki tek fark klasör var ise bu klasöre GetFolderAsync methodu ile girip klasör içerisinde CheckExistsAsync methodunu flasörün değil dosyanın adı ile yapmamız.

Şimdi ise dosya kayıt ve dosya getirme işlemlerini irdeleyim.Bu işlemler için ortak olacak olan bir klasör içerinden dosya getirme fonksiyonu yazalım. Fonksiyonumuzun adı “GetFileFromFolder” olsun.

Bu fonksiyon içerisine klasör ve dosya adı almaktadır. Geriye ise “Ifile” dönmelidir.Burda ben ortaklaştırma adına “CreateFileAsync” methodunu OpenIfExists olarak kullandım buda bana eğer dosya var ise dosyayı dönmesini yok ise oluşturulup oluşan dosyayı dönmesini sağlamaktadır.

CreateFileFromString

Helper fonksiyonumuzu tamamladığımıza göre şimdi “CreateFileFromString” yazabiliriz.Method içerisine klasör adı , dosya adı ve dosyanın içeriğini almaktadır. Çıktı olarak ise kayıt edilen dosyanın localdeki erişim pathini dönmektedir.

GetFileFromFolder ile dönen requestedFile dosyamıza Ifile “WriteAllTextAsync” yardımıyla içeriği (content) yazdırıyoruz. Daha sonra ise requestedFile’in Path’ini return ediyoruz.

 ReadFileAsString

Şimdi ise kaydettiğimiz dosyanın içeriğini okuyacağımız ReadFileAsString methodumuzu yazıyoruz. Burada ise “WriteAllTextAsync” in  tam tersi olarak “RealAllTextAsync” kullanarak dosyamızın string içeriğine erişiyoruz ve bu content i return ediyoruz.

SaveStreamAsFile 

Elimizdeki URL den download ettiğimiz veya direk API dan bize sağlanan Stream haldeki dosyayı LocalStorage a kaydetmek için kullanacağımız “SaveStreamAsFile” ‘ı oluşturalım. Burada Klasörü oluşturup Async olarak dosyayı yaratıyorum ve bu stream e elimde bulunan ve methoda yolladığım stream’i CopyTo ile kaydediyorum.Daha sonra ise dosyanın path’ini return ediyorum.

Şimdilik bu kadar bu makalemizde Local Storage da klasör ve dosya oluşturma, stream üzerinden gelen veriyi dosya olarak kaydetme ve string içerikli dosyanın içerisindeki content e erişme işlemlerini tamamladık. Makalemin ikinci bölümünde ise artık Servis kısmına geçip örnekler ile kullanımı ve pek tabiki URL üzerinden indirilen dosyanın LocalStorage’a kaydedilmesini ve tekrar görüntülenmesi konularını irdeleyeceğiz.

Xamarin Türkiye

Yorum Gönder