Saha uygulamalarında çevrimdışı-öncelikli depolamada SQLite vs Realm
SQLite ve Realm’i saha uygulamalarında çevrimdışı-öncelikli depolama için karşılaştırma: göçler, sorgu seçenekleri, çakışma yönetimi, hata ayıklama araçları ve pratik seçim ipuçları.

Saha uygulamaları için gerçekten gerekenler
Çevrimdışı-öncelikli olmak sadece “internetsiz çalışmak” demek değildir. Uygulamanın kullanışlı veriyi yükleyebilmesi, yeni girdileri kabul etmesi ve her düzenlemeyi senkronize olana kadar güvende tutması gerekir.
Saha çalışması öngörülebilir kısıtlar getirir: sinyal kesilip gelir, oturumlar uzun sürer, cihazlar eski olabilir ve pil tasarruf modları yaygındır. İnsanlar hızlı hareket eder. Bir işi açarlar, uzun listelerde kaydırırlar, fotoğraf çekerler, formları doldururlar ve depolama hakkında düşünmeden bir sonraki işe geçerler.
Kullanıcıların fark ettiği şey basittir. Düzenlemeler kaybolduğunda, çevrimdışıyken listeler ve arama yavaşladığında, uygulama “işim kaydedildi mi?” sorusuna net yanıt veremediğinde, kayıtlar yeniden bağlandıktan sonra kopyalandığında veya kaybolduğunda ya da bir güncelleme garip davranışlara yol açtığında güven kaybederler.
Bu yüzden SQLite ile Realm arasında seçim yapmak büyük ölçüde günlük davranışla ilgilidir, benchmarklarla değil.
Yerel veritabanını seçmeden önce dört alanda net olun: veri modeliniz değişecek, sorgular gerçek iş akışlarına uymalı, çevrimdışı senkron çakışmalar yaratacak ve araçlar sahadaki sorunları ne kadar hızlı teşhis edebileceğinizi belirleyecek.
1) Veriniz değişecek
İstikrarlı görünen uygulamalar bile gelişir: yeni alanlar, yeniden adlandırmalar, yeni ekranlar. Model değişiklikleri zahmetli olursa ya daha az iyileştirme gönderirsiniz ya da gerçek veriye sahip cihazları bozma riskini alırsınız.
2) Sorgular gerçek iş akışlarına uymalı
Saha uygulamalarında “bugünün işleri”, “yakındaki sahalar”, “senkronize edilmemiş formlar” ve “son 2 saatte düzenlenenler” gibi hızlı filtrelere ihtiyaç vardır. Veritabanı bu sorguları uygulamayı zorlaştırıyorsa, UI yavaşlar veya kod karmaşıklaşır.
3) Çevrimdışı senkron çakışmaları yaratır
Aynı kaydı iki kişi düzenleyebilir veya bir cihaz eski veriyi günlerce düzenleyebilir. Hangi değişikliğin kazanacağı, neyin birleştirileceği ve hangi durumların insan kararına bırakılacağı konusunda net bir plana ihtiyacınız vardır.
4) Araçlar önemlidir
Sahada bir şey ters gittiğinde, veriyi inceleyip hatayı tekrarlamak ve ne olduğunu anlamak için aracınız olmalı.
Göçler: veri modelini kullanıcıları kırmadan değiştirmek
Saha uygulamaları nadiren sabit kalır. Birkaç hafta içinde bir onay kutusu eklersiniz, bir statüyü yeniden adlandırırsınız veya “notlar” alanını yapılandırılmış alanlara bölersiniz. Göçler, telefon zaten gerçek veri tuttuğunda çevrimdışı uygulamaların sık başarısız olduğu yerdir.
SQLite verileri tablolar ve sütunlar halinde depolar. Realm verileri özelliklere sahip nesneler olarak saklar. Bu fark çabuk kendini gösterir:
- SQLite ile genelde açık şema değişiklikleri yazarsınız (ALTER TABLE, yeni tablolar, veri kopyalama).
- Realm ile genelde bir şema sürümü yükseltir ve nesneler erişildikçe güncelleyen bir göç fonksiyonu çalıştırırsınız.
Alan eklemek her iki sistemde de kolaydır: SQLite’ta bir sütun ekleyin, Realm’de varsayılanlı bir özellik ekleyin. Yeniden adlandırmalar ve bölmeler acı verir. SQLite’ta yeniden adlandırma kurulumunuza bağlı olarak sınırlı olabilir; bu yüzden ekipler genelde yeni bir tablo oluşturup veriyi kopyalar. Realm’de eski özelliği okuyup yeni olanlara yazabilirsiniz, ancak tipler, varsayılanlar ve null değerlerle dikkatli olmak gerekir.
Cihazdaki büyük güncellemeler ekstra dikkat ister. Her kaydı yeniden yazan bir göç eski telefonlarda yavaş olabilir ve bir teknisyenin otoparkta yükleme çubuğunu izlemek zorunda kalmaması gerekir. Göç süresini planlayın ve ağır dönüşümleri birden fazla sürüme yaymayı düşünün.
Göçleri adilce test etmek için onları senkronizasyon gibi ele alın:
- Eski bir yapıyı yükleyin, gerçekçi veri oluşturun, sonra yükseltin.
- Küçük ve büyük veri kümelerini test edin.
- Göç sırasında uygulamayı öldürüp yeniden başlatın.
- Düşük depolama senaryolarını test edin.
- Geri alamıyorsanız bile ileriye güvenle gidebileceğinizi varsayın.
Örnek: “equipmentId” sonra “assetId” olduğunda ve daha sonra “assetType” ile “assetNumber” olarak bölündüğünde, göç eski denetimleri kullanılabilir tutmalı, kullanıcıyı zorla oturum kapatmaya veya veri silmeye zorlamamalıdır.
Sorgu esnekliği: veriden ne isteyebilirsiniz
Saha uygulamaları liste ekranlarında yaşar veya ölür: bugünün işleri, yakın varlıklar, açık talepleri olan müşteriler, bu hafta kullanılan parçalar. Depolama seçiminiz bu soruları kolay ifade etmeyi, hızlı çalıştırmayı ve altı ay sonra yanlış okunmayı zorlaştırmayı sağlamalıdır.
SQLite size SQL verir; büyük veri kümelerini filtrelemek ve sıralamak için hâlâ en esnek yoldur. Koşulları birleştirebilir, tablolar arası join yapabilir, sonuçları gruplayabilir ve bir ekran yavaşladığında indeks ekleyebilirsiniz. Uygulamanız “Bölge A’daki varlıkların tüm muayeneleri, Takım 3’e atanmış ve herhangi bir kontrol listesindeki başarısız madde ile” gibi sorgulara ihtiyaç duyuyorsa, SQL bunu temizce ifade edebilir.
Realm nesnelere ve daha yüksek seviyeli bir sorgu API’sine dayanır. Birçok uygulama için bu doğal gelir: Job nesnelerini sorgulamak, statüye göre filtrelemek, teslim tarihine göre sıralamak, ilişkileri takip etmek. Takas, SQL’de basit olan bazı soruların (özellikle birden fazla ilişkiyi kapsayan raporlama sorguları) ifade etmenin daha zor olması veya veriyi ihtiyaç duyduğunuz sorgulara uydurmak için yeniden şekillendirmeniz gerekmesidir.
Arama ve ilişkiler
Birkaç alan üzerinde kısmi metin araması için (iş başlığı, müşteri adı, adres) SQLite sizi dikkatli indekslemeye veya adanmış bir tam metin yaklaşımına itebilir. Realm de metin filtreleyebilir, ancak performans ve “içerir” anlamı büyük ölçekte ne demek diye düşünmeniz gerekir.
İlişkiler pratik bir başka sıkıntıdır. SQLite, birçok-çok ve bir-çok ilişkileri join tablolarla halleder; “bu iki etikete sahip varlıklar” gibi desenler bu sayede doğrudandır. Realm linkleri kod içinde gezinmeyi kolaylaştırır, ama birçok-çok ve “sorgu üzerinden” desenleri hızlı okumaları korumak için daha fazla planlama gerektirebilir.
Ham sorgular vs bakım kolaylığı
Bakımı kolay bir desen, ekranlara ve raporlara doğrudan eşlenen küçük bir isimlendirilmiş sorgu seti tutmaktır: ana liste filtreleri ve sıralamalar, detay görüntü sorgusu (bir kayıt ve ilişkili kayıtlar), arama tanımı, birkaç sayaç (rozetler ve çevrimdışı toplamlar) ve herhangi bir dışa aktarma/raporlama sorgusu.
İşten gelen sık ad-hoc soru beklerseniz, SQLite’ın ham sorgu gücü zor yenilir. Çoğu veri erişiminin normal nesnelerle çalışıyormuş gibi görünmesini istiyorsanız ve Realm en zor ekranlarınızı garip çözümlere zorlamadan cevaplayabiliyorsa, Realm daha hızlı inşa edilebilir hissi verebilir.
Çakışma çözümü ve senkronizasyon: ne tür destek alırsınız
Çevrimdışı-öncelikli saha uygulamaları genelde aynı çekirdekteki eylemleri destekler: bir kayıt oluşturma, güncelleme, geçersiz bir şeyi silme. Zor olan yer yerelde kaydetmek değil. İki cihaz aynı kaydı senkronize olmadan önce değiştirdiğinde ne olacağına karar vermektir.
Çakışmalar basit durumlarda ortaya çıkar. Bir teknisyen sinyali olmayan bir bodrum katta bir muayeneyi günceller. Daha sonra bir denetçi aynı muayeneyi bir laptoptan düzeltir. Her ikisi de tekrar bağlandığında sunucu iki farklı versiyon alır.
Çoğu ekip şu yaklaşımlardan birinde karar kılar:
- Son yazan kazanır (hızlı ama iyi veriyi sessizce üzerine yazabilir)
- Alan bazlı birleştirme (farklı alanlar değiştiğinde daha güvenli, ama net kurallar gerekir)
- Manuel inceleme kuyruğu (en yavaşı, yüksek riskli değişiklikler için en güvenlisi)
SQLite güvenilir bir yerel veritabanı sunar, ama kendi başına senkronizasyon sağlamaz. Genelde geri kalanını siz inşa edersiniz: bekleyen işlemleri takip etmek, bunları bir API’ye göndermek, güvenli şekilde yeniden denemek ve sunucuda çakışma kurallarını uygulamak.
Realm, senkron özelliklerini kullanırsanız işinizi azaltabilir çünkü nesneler ve değişiklik takibi etrafında tasarlanmıştır. Ancak “gömülü senkron” yine de işletme kurallarınızı seçmez. Hangi durumların çakışma sayılacağını ve hangi verinin kazanacağını siz belirlersiniz.
Baştan bir denetim izi planlayın. Saha ekipleri genellikle “kim neyi, ne zaman ve hangi cihazdan değiştirdi” sorularına net yanıtlar ister. Son yazan kazanır kuralını seçseniz bile, kullanıcı kimliği, cihaz kimliği, zaman damgaları ve (mümkünse) bir neden gibi meta verileri saklayın. Backend’iniz hızlı geliştiriliyorsa, örneğin AppMaster (appmaster.io) gibi bir no-code platformla, yüzlerce çevrimdışı cihaz sahaya düşmeden önce bu kurallar üzerinde yineleme yapmak daha kolaydır.
Hata ayıklama ve inceleme: saha hatalarını sahaya düşmeden yakalamak
Çevrimdışı hatalar zordur çünkü uygulamanın sunucuyla konuştuğunu izleyemezsiniz. Hata ayıklama deneyiminiz genelde şu soruya bağlıdır: cihazdaki veriyi ve zaman içinde nasıl değiştiğini ne kadar kolay görebilirsiniz?
SQLite, bir dosya olduğu için incelemesi kolaydır. Geliştirme veya QA ortamında bir test cihazından veritabanını çekip yaygın SQLite araçlarıyla açabilir, ad-hoc sorgular çalıştırabilir ve tabloları CSV veya JSON'a aktarabilirsiniz. Bu size “hangi satırlar var” ile “UI ne gösteriyor” arasındaki farkı doğrulamada yardımcı olur. Dezavantajı, şemanızı, join'leri ve oluşturduğunuz göç iskelesini anlamanız gerektiğidir.
Realm uygulama-benzeri bir inceleme hissi verebilir. Veri nesneler olarak saklanır ve Realm’in araçları sınıfları, özellikleri ve ilişkileri gezmeyi kolaylaştırır. Bu, eksik linkler veya beklenmeyen null'lar gibi nesne grafiği sorunlarını görmek için iyidir; ancak ekip SQL tabanlı incelemeye alışkınsa ad-hoc analiz daha az esnek olabilir.
Çevrimdışı sorunları loglama ve tekrarlama
Çoğu saha hatası sessiz yazma hatalarına, kısmi senkron partilerine veya yarım kalan bir göçe dayanır. Her durumda birkaç temele yatırım yapın: kayıt başına “son değişiklik” zaman damgaları, cihaz tarafı işlem günlüğü, göçler ve arka plan yazmaları etrafında yapılandırılmış günlükler, QA sürümlerinde ayrıntılı log etkinleştirme ve kırpılmış bir anlık görüntü dışa aktarma eylemi.
Örnek: bir teknisyen tamamladığı muayenelerin pil boşaldıktan sonra kaybolduğunu bildiriyorsa, paylaşılan bir anlık görüntü hangi kayıtların hiç yazılmadığını, yazıldığını ama sorgulanmadığını veya başlatmada geri alındığını doğrulamaya yardımcı olur.
Başarısız bir anlık görüntü paylaşma
SQLite ile paylaşım genelde .db dosyasını (ve varsa WAL dosyalarını) paylaşmak kadar basittir. Realm ile genelde Realm dosyasını ve yan dosyalarını paylaşırsınız. Her iki durumda da cihazdan herhangi bir şey çıkmadan önce hassas verileri kaldırmak için tekrarlanabilir bir süreç tanımlayın.
Gerçek dünyada güvenilirlik: arızalar, sıfırlamalar ve yükseltmeler
Saha uygulamaları pilin bitmesi sırasında kayıt kaybetme, OS’in uygulamayı arka planda öldürmesi veya fotoğraflar ve günlükler nedeniyle depolamanın dolması gibi sıradan şekillerde başarısız olur. Yerel veritabanı seçiminiz bu arızaların ne sıklıkla kayıp işe dönüşeceğini etkiler.
Bir çökme yazma ortasında olursa, doğru kullanıldığında hem SQLite hem Realm güvenli olabilir. SQLite, değişiklikleri işlemler içinde sardığınızda (WAL modu dayanıklılık ve performans için yardımcı olabilir) güvenilir olur. Realm yazmaları varsayılan olarak işlemseldir, bu yüzden genelde ekstra işleme gerek kalmadan “ya hep ya hiç” kaydetme elde edersiniz. Yaygın risk veritabanı motoru değil; birden fazla adımda yazan ve net bir commit noktası olmayan uygulama kodudur.
Bozulma nadirdir ama yine de bir kurtarma planına ihtiyacınız var. SQLite ile bütünlüğü kontrol edebilir, bilinen iyi bir yedekten geri yükleyebilir veya sunucudan yeniden senkronize ederek yeniden oluşturabilirsiniz. Realm’de bozulma genelde tüm Realm dosyasını şüpheli hale getirir, bu yüzden pratik kurtarma yolu genelde “yereli düşür ve yeniden senkronize et” olur (sunucu kaynak otoritesi ise sorun değil; cihaz benzersiz veri tutuyorsa can sıkıcıdır).
Depolama büyümesi başka bir sürprizdir. SQLite silme sonrası şişebilir; düzenli VACUUM yapılması gerekir. Realm da büyüyebilir ve sıkıştırma politikalarına ve eski nesnelerin (tamamlanmış işler gibi) budanmasına ihtiyaç duyabilir, böylece dosya sonsuza dek genişlemez.
Yükseltmeler ve geri alma başka bir tuzaktır. Bir güncelleme şemayı veya depolama formatını değiştirdiyse, geri alma kullanıcıları yeni bir dosyada sıkışmış bırakabilir. Yükseltmeleri tek yön olarak planlayın, güvenli göçler hazırlayın ve uygulamayı kırmadan yereli sıfırlama seçeneği sunun.
Güvenilirlik alışkanlıkları:
- “Disk dolu” ve yazma hatalarını net bir mesaj ve yeniden deneme yolu ile ele alın.
- Kullanıcı girdilerini yalnızca uzun bir formun sonunda değil, checkpoint’ler halinde kaydedin.
- Kurtarma ve destek için hafif bir yerel denetim günlüğü tutun.
- Veritabanı çok büyümeden önce eski kayıtları budayın ve arşivleyin.
- Düşük uç cihazlarda OS yükseltmeleri ve arka plan öldürmeleri test edin.
Örnek: kontrol listeleri ve fotoğraflar depolayan bir muayene uygulaması bir ay içinde düşük depolama ile karşılaşabilir. Uygulama düşük alanı erken tespit ederse, fotoğraf çekmeyi duraklatabilir, mümkün olduğunda yükleyebilir ve kontrol listesi kayıtlarını güvenli tutabilir; hangi yerel veritabanını kullandığınız fark etmez.
Adım adım: depolama yaklaşımınızı nasıl seçip kurarsınız
Depolamayı bir kütüphane kararı değil, ürünün bir parçası olarak ele alın. En iyi seçenek, sinyal düştüğünde uygulamanın kullanılabilir kalmasını ve sinyal geri geldiğinde öngörülebilir davranmasını sağlayandır.
Basit bir karar yolu
Önce çevrimdışı kullanıcı akışlarınızı yazın. Spesifik olun: “bugünün işleri aç, not ekle, fotoğraf ekle, tamamla, imza al.” Bu listedeki her şey ağ olmadan her seferinde çalışmalı.
Sonra kısa bir sıra izleyin: çevrimdışı-kritik ekranları ve her birinin ne kadar veriye ihtiyaç duyduğunu listeleyin (bugünün işleri vs tam geçmiş), taklit edilemeyecek minimal bir veri modeli ve ilişkileri çizin (Job -> ChecklistItems -> Answers), her varlık için bir çakışma kuralı seçin (hepsi için tek bir kural değil), hata test etme planınızı belirleyin (gerçek cihazlarda göçler, senkron yeniden denemeler, zorla çıkış/yeniden kurulum davranışı), ve gerçekçi verilerle küçük bir prototip inşa edip sürelerini ölçün (yükleme, arama, kaydetme, bir gün çevrimdışı sonra senkron).
Bu süreç genellikle gerçek kısıtı ortaya çıkarır: esnek ad-hoc sorgular ve kolay inceleme mi gerekiyor, yoksa nesne tabanlı erişimi ve daha sıkı model denetimini mi önemsiyorsunuz?
Prototipte doğrulanacaklar
Gerçekçi bir senaryo kullanın, örneğin bir teknisyenin bir gün içinde 30 muayeneyi çevrimdışı tamamlaması ve sonra kapsama alanına geri dönmesi. 5.000 kayıtla ilk yükleme süresini ölçün, bir şema değişikliğinin bir güncellemeden sonra hayatta kalıp kalmadığını, yeniden bağlandıktan sonra kaç çakışma çıktığını ve her birini açıklayıp açıklayamadığınızı, ve bir destek araması geldiğinde “kötü kaydı” ne kadar hızlı inceleyebildiğinizi doğrulayın.
Hızla doğrulamak için prototipleme yapmak istiyorsanız, AppMaster gibi bir no-code prototip size iş akışını ve veri modelini erken kilitlemenizde yardımcı olabilir; hatta on-device veritabanı seçimini finalize etmeden önce.
Çevrimdışı-öncelikli uygulamalara zarar veren yaygın hatalar
Çoğu başarısızlık veritabanı motorundan gelmez. Sıkıcı kısımları atlamaktan gelir: yükseltmeler, çakışma kuralları ve net hata işleme.
Bir tuzak çakışmaların nadir olduğunu varsaymaktır. Saha çalışmalarında bunlar normaldir: iki teknisyen aynı varlığı düzenleyebilir veya bir denetçi cihaz çevrimdışı iken kontrol listesine müdahale edebilir. Bir kural tanımlamazsanız (son yazan kazanır, alan bazlı birleştirme veya her iki versiyonu saklama), gerçek işi zamanla üzerine yazarsınız.
Başka bir sessiz başarısızlık, veri modelini “tamamlandı” gibi görüp yükseltmeleri pratik etmemektir. Şema değişiklikleri küçük uygulamalarda bile olur. Şemanızı sürümlendirmez ve eski sürümlerden yükseltmeleri test etmezseniz, kullanıcılar bir güncellemeden sonra göç hataları veya boş ekranlarla karşılaşabilir.
Performans sorunları da geç ortaya çıkar. Ekipler bazen her şeyi “her ihtimale karşı” indirir, sonra neden arama yavaş ve uygulama orta seviye bir telefonda açılmasının dakikalar sürdüğünü merak eder.
Dikkat edilmesi gereken desenler:
- Yazılı bir çakışma politikası yok, bu yüzden düzenlemeler sessizce üzerine yazılıyor.
- Fresh yüklemelerde çalışan göçler gerçek yükseltmelerde başarısız oluyor.
- Kontrolsüz çevrimdışı önbellek büyüyor ve sorguları yavaşlatıyor.
- Senkron hataları bir yükleme çubuğunun arkasında gizleniyor, kullanıcı verinin gönderildiğini sanıyor.
- Tahminlerle hata ayıklama yerine tekrarlanabilir repro betikleri ve örnek veriler yok.
Örnek: bir teknisyen çevrimdışı bir muayeneyi tamamlar, Senkron butonuna basar ve onay almaz. Yükleme aslında auth token hatası nedeniyle başarısız olur. Uygulama hatayı gizlerse teknisyen işi bitmiş sanıp sahayı terk eder ve güven kaybolur.
Hangi depolama seçilirse seçilsin, şu temel “saha modu” testini çalıştırın: uçak modu, düşük pil, uygulama güncellemesi ve aynı kaydı iki cihazın düzenlemesi. Eğer hızlı inşa ediyorsanız ve AppMaster gibi bir no-code platformla çalışıyorsanız, bu testleri prototipe erken dahil edin.
Hızlı kontrol listesi: karar vermeden önce
Depolama motorunu seçmeden önce “iyi”nin ne olduğunu tanımlayın ve bunu gerçek verilerle gerçek cihazlarda test edin. Ekipler özellikler üzerinde tartışır; ama çoğu hata temelden gelir: yükseltmeler, yavaş ekranlar, belirsiz çakışma kuralları ve yerel durumun incelenememesi.
Bu listeyi bir geçiş/kalma kapısı olarak kullanın:
- Yükseltmeleri kanıtlayın: en az iki eski sürümü alın, bugünkü sürüme yükseltin ve verinin hâlâ açıldığını, düzenlenebildiğini ve senkronize edildiğini onaylayın.
- Gerçek hacimde ana ekranları hızlı tutun: gerçekçi verilerle en yavaş ekranları orta sınıf bir telefonda zamanlayın.
- Kayıt türü başına çakışma politikası yazın: muayeneler, imzalar, kullanılan parçalar, yorumlar.
- Yerel veriyi incelenebilir ve günlükleri toplanabilir yapın: destek ve QA'nın çevrimdışıyken durumu nasıl yakalayacağını tanımlayın.
- Kurtarmayı öngörülebilir kılın: önbellek ne zaman yeniden oluşturulur, yeniden indirme ne zaman yapılır veya tekrar oturum açma ne zaman gerekir? “Uygulamayı yeniden yüklemek” planınız olmasın.
AppMaster ile prototipleme yapıyorsanız aynı disiplini uygulayın: yükseltmeleri test edin, çakışmaları tanımlayın ve büyük bir ekibe göndermeden önce kurtarma uygulamalarını prova edin.
Örnek senaryo: sinyali zayıf bir teknisyen muayene uygulaması
Bir saha teknisyeni güne 50 iş emrini telefonuna indirerek başlar. Her iş adres, gereken kontrol maddeleri ve birkaç referans fotoğrafı içerir. Gün boyunca sinyal gidip gelir.
Her ziyaret sırasında teknisyen aynı birkaç kaydı tekrar tekrar düzenler: iş durumu (Varış, İşte, Tamamlandı), kullanılan parçalar, müşteri imzası ve yeni fotoğraflar. Bazı düzenlemeler küçük ve sık (durum). Diğerleri büyük (fotoğraflar) ve kaybolmamalıdır.
Senkron anı: aynı iş üzerinde iki kişi işlem yaptı
11:10'da teknisyen İş #18'i Tamamlandı olarak işaretler ve imza eklerken çevrimdışıdır. 11:40'ta bir planlayıcı ofisten İş #18'i hâlâ açık görüp yeniden atar. Teknisyen 12:05'te yeniden bağlandığında, uygulama değişiklikleri yüklüyor.
İyi bir çakışma akışı bunu gizlemez; görünür kılar. Bir denetçi basit bir mesaj görmelidir: “İş #18'in iki versiyonu var” ve ana alanlar yan yana (durum, atanmış teknisyen, zaman damgası, imza var/yok) ve net seçenekler sunulmalıdır: alan güncellemesini sakla, ofis güncellemesini sakla veya alan bazlı birleştir.
İşte depolama ve senkron kararlarınız gerçek hayatta bunu gösterir: temiz bir değişiklik geçmişi takip edebiliyor ve saatlerce çevrimdışı kaldıktan sonra bunları güvenle yeniden oynatabiliyor musunuz?
Bir iş “kayboldu”ğunda hata ayıklama çoğunlukla ne olduğunu kanıtlamakla ilgilidir. Yeterli günlük kaydedin: yerel kayıt kimliği ve sunucu kimliği eşlemesi (ne zaman oluşturulduğu dahil), her yazma işlemi zaman damgası/kullanıcı/cihaz ile, senkron denemeleri ve hata mesajları, çakışma kararları ve kazanan, ve fotoğraf yükleme durumunu iş kaydından ayrı takip edin.
Bu günlüklerle problemi tahmin etmek yerine yeniden üretebilirsiniz.
Sonraki adımlar: hızlıca doğrulayın, sonra tam saha çözümünü inşa edin
SQLite vs Realm tartışmasına girmeden önce çevrimdışı akışlarınız için tek sayfalık bir spes yazın: teknisyenin gördüğü ekranlar, hangi verinin cihazda yaşayacağı ve sinyal olmadan neyin çalışması gerektiği (oluşturma, düzenleme, fotoğraflar, imzalar, sıraya alınmış yüklemeler).
Sonra tüm sistemi erken prototipleyin, sadece veritabanını değil. Saha uygulamaları kenarlarda başarısız olur: mobil form yerel olarak kaydediyor olsa bile, admin ekibi kayıtları inceleyip düzeltemiyorsa veya backend daha sonra güncellemeleri reddediyorsa bu işe yaramaz.
Pratik doğrulama planı:
- İnce uçtan uca bir dilim oluşturun: bir çevrimdışı form, bir liste görünümü, bir senkron denemesi, bir yönetici ekranı.
- Bir değişiklik testi yapın: bir alanı yeniden adlandırın, bir alanı ikiye bölün, test sürümü gönderin ve yükseltmenin davranışını görün.
- Çakışmaları simüle edin: aynı kaydı iki cihazda düzenleyin, farklı sıralarda senkronlayın ve neyin bozulduğunu not edin.
- Saha hata ayıklamayı prova edin: yerel veriyi, günlükleri ve başarısız senkron payload'larını gerçek bir cihazda nasıl inceleyeceğinize karar verin.
- Bir sıfırlama politikası yazın: yerel önbellek ne zaman silinir ve kullanıcılar işi kaybetmeden nasıl kurtarılır.
Eğer hız önemliyse, önce bir no-code yaklaşımı akışı hızlıca doğrulamanıza yardım edebilir. AppMaster (appmaster.io) bunlardan biridir: backend servisleri, web yönetim paneli ve mobil uygulamaları erken oluşturup gereksinimler değiştikçe temiz kaynak kod üretme imkânı verir.
Risk bazlı bir sonraki doğrulama adımını seçin. Formlar haftalık değişiyorsa önce göçleri test edin. Birden fazla kişi aynı işi düzenliyorsa çakışmaları test edin. “Ofiste çalışıyordu” korkunuz varsa saha hata ayıklama iş akışını önceliklendirin.
SSS
Çevrimdışı-öncelikli, uygulamanın bağlantı olmasa bile işe yarar kalması demektir: gerekli verileri yükleyebilmesi, yeni girdileri kabul etmesi ve her değişikliği senkronizasyon mümkün olana kadar güvende tutması. Kritik vaat, sinyal kesildiğinde, işletim sistemi uygulamayı kapattığında veya pil görev ortasında bittiğinde kullanıcıların işlerini veya güvenini kaybetmemeleridir.
SQLite, karmaşık filtrelere, raporlamaya yakın sorgulara, çoktan-çoğa ilişkilerine ve yaygın araçlarla kolay incelemeye ihtiyaç duyduğunuzda genelde daha güvenli bir varsayımdır. Realm, nesne tarzı erişim, varsayılan işlem yazmaları ve veri erişiminizin Realm’in güçlü yönleriyle uyumlu olduğu durumlarda iyi bir seçim olabilir.
Geçişleri tek seferlik bir iş değil, temel bir özellik olarak ele alın. Eski bir sürümü yükleyin, cihazda gerçekçi veri oluşturun, sonra yükseltip uygulamanın hâlâ açıldığını, düzenlenebildiğini ve senkronize edildiğini doğrulayın; ayrıca büyük veri kümelerini, düşük depolama durumlarını ve yükseltme sırasında uygulamanın ölümünü de test edin.
Her iki sistemde de alan eklemek genelde sorunsuzdur; ancak yeniden adlandırmalar ve alan bölmeleri gerçek cihazlarda en riskli değişiklerdir. Bu değişiklikleri kasıtlı planlayın, makul varsayılanlar belirleyin, null değerleri dikkatle ele alın ve eski cihazlarda tüm kayıtları tek seferde yeniden yazan göçlerden kaçının.
Saha uygulamaları için önemli sorgular genelde liste ekranları ve filtrelerdir: “bugünün işleri”, “senkronize edilmemiş formlar”, “son 2 saatte düzenlenenler” ve hızlı arama. Bu sorguları ifade etmek zorlaşırsa, ya UI yavaşlar ya da kod sürdürülemez hale gelir.
Ne SQLite ne de Realm tek başına çakışmayı “çözer”; yine de işletme kurallarına ihtiyacınız var. Her varlık türü için net bir kural seçin (son yazan kazanır, alan bazlı birleştirme veya manuel inceleme kuyruğu) ve iki cihazın aynı kaydı değiştirdiği durumda uygulamanın ne olduğunu açıklayabildiğinden emin olun.
Destek ekibinin “işim kayboldu” bildirimlerini tanımlayabilmesi için yeterli meta veriyi kaydedin: kullanıcı kimliği, cihaz kimliği, zaman damgaları ve kayıt başına “son değişiklik” işareti. Cihaz tarafında queued (kuyruğa alınmış) işlemleri gösteren bir işlem günlüğü tutun ki neyin gönderildiğini, neyin başarısız olduğunu ve sunucunun neyi kabul ettiğini görebilin.
SQLite, bir dosya olduğu için cihazdan çekip doğrudan sorgulayarak incelemeyi kolay kılar; bu, rastgele analiz ve dışa aktarma için faydalıdır. Realm ise nesne grafiği ve ilişkileri görmekte doğal bir deneyim sunar; ancak SQL'e alışkın ekipler için derinlemesine ad-hoc analizde daha az esnek hissedilebilir.
İyi bir yerel veritabanı olsa bile veri kaybına yol açan en yaygın sorunlar uygulama mantığındaki hatalardır: net bir commit noktası olmadan çok adımlı yazmalar, gizlenen senkron hata durumları ve disk dolması ya da bozulma senaryoları için kurtarma yolu olmaması. İşlemler/checkpoint'ler kullanın, kaydetme ve senkron durumunu açık gösterin ve “sıfırla ve yeniden senkronize et” seçeneğini öngörülebilir kılın.
Bir depolama motoruna karar vermeden önce gerçekçi bir uçtan uca senaryo kurun ve ölçün: binlerce kayıtla ilk yükleme, arama, uzun form kayıtları ve bir gün boyunca çevrimdışı olup sonra yeniden bağlanma senkronu. En az iki eski sürümden yükseltmeyi doğrulayın, iki cihazla çakışmaları simüle edin ve hata durumunda yerel durumu ve günlükleri inceleyebildiğinizden emin olun.


