Hive, yerel kod olmadan çalışan Flutter için hafif bir NoSQL deposudur. SQLite veya Firebase'in aksine, Hive yerel kütüphaneler gerektirmez ve yalnızca Dart aracılığıyla çalışır. Pub.dev, 2024'e göre, Hive 10 milyondan fazla kez indirilmiş ve sunucu altyapısı olmadan yerel veri depolama gerektiren her üç Flutter projesinden birinde kullanılmaktadır.
Önemli Noktalar
Hive, tamamen Dart ile yazılmış ve yerel kütüphane gerektirmeyen bir NoSQL veritabanıdır. 2019 yılında Simon Leiter tarafından Flutter projeleri için SQLite'a alternatif olarak oluşturulmuştur. Hive, mobil cihazlarda hızlı okuma ve yazma için optimize edilmiş ikili .hive formatında veri depolar. .hive formatı, her veri türünün kendi bayt önekine sahip olduğu özel bir serileştirme şeması kullanır ve Protocol Buffers veya FlatBuffers'ın aksine, önceden şema bilgisi olmadan dosyanın okunmasına olanak tanır.
Hive'ın temel fikri maksimum basitliktir. Veritabanı, yerel motor başlatma gerektirmez, SQL ayrıştırıcısı içermez ve yansıma kullanmaz. Tüm işlemler, WriteBuffer ve ReadBuffer aracılığıyla ikili serileştirme ile doğrudan Dart işlev çağrılarıdır.
Flutter Community anketine (2023) göre Hive, Flutter'da en çok kullanılan ilk 5 veri depolama paketi arasında yer almakta, popülerlikte yalnızca shared_preferences'in ardından ikinci sırada gelmekte, ancak işlevsellik ve hız açısından onu geçmektedir.
Hive, Box kavramını kullanır — ilişkisel veritabanlarındaki tabloya benzer. Her Box, diskte bir dizi anahtar-değer çifti içeren bir dosyadır. Anahtar int veya String olabilir, değer herhangi bir ilkel tür, liste, Map veya TypeAdapter aracılığıyla özel bir nesne olabilir. Box'lar birbirinden izole edilmiştir ve bağımsız olarak açılır.
Hive platform kanalları gerektirmez. Bu, ek yapılandırma olmadan Android, iOS, Web, macOS, Windows ve Linux'ta aynı şekilde çalıştığı anlamına gelir. Web derlemelerini hedefleyen projeler için Hive, tek hafif NoSQL çözümü olmaya devam etmektedir — SQLite tarayıcıda çalışmaz. Hive, web için arka uç olarak IndexedDB kullanır ve tarayıcı ortamında bile veri kalıcılığı sağlar.
Hive, yazma sırasında verileri ikili formata serileştirir ve okuma sırasında seri durumdan çıkarır. Dahili mekanizma, verileri kompakt bayt dizilerine paketleyen BinaryWriter ve BinaryReader'a dayanır. Disk üzerindeki depolama boyutu, aynı verilerin JSON temsilinden ortalama 2–3 kat daha küçüktür.
Bir Box açıldığında, Hive tüm dosyayı RAM'e yükler. Bu, yüksek okuma hızı (mikrosaniyeler) sağlar ancak bir boyut sınırlaması getirir: Box başına 50–100 MB'den fazla depolanmaması önerilir. Daha büyük hacimler için LazyBox kullanın — diskten kayıtların tembel yüklenmesi.
Hive, bir Dart izolatı içinde tek iş parçacıklı olarak çalışır. Yazma işlemleri, dosya kilitleme ile senkron olarak gerçekleştirilir. Zaman uyumsuz erişim için, await ile Hive.openBox() kullanın. Birden çok izolattan eşzamanlı erişim doğrudan desteklenmez — ayrı bir senkronizasyon mekanizması gerekir.
Hive, SharedPreferences ve SQLite arasında bir niş işgal eder. SharedPreferences'dan daha karmaşıktır (özel nesneleri destekler) ancak SQLite'dan daha basittir (SQL sorguları gerekmez). Temel özellikleri karşılaştıralım.
| Özellik | Hive | SharedPreferences | SQLite |
|---|---|---|---|
| Veri türleri | Herhangi biri (TypeAdapter ile) | Yalnızca ilkel | SQL türleri |
| Okuma hızı | ~30.000 ops/s | ~5.000 ops/s | ~2.000 ops/s |
| Yerel kod | Gerekmez | Gerekli (Android) | Gerekli |
| Web desteği | Evet | Hayır | Hayır |
| Karmaşıklık | Düşük | Minimum | Orta |
| Tepkisellik | WatchBox | Hayır | ORM ile |
Hive küçük veri hacimleri için idealdir: uygulama ayarları, API yanıtları önbelleği, yerel senkronizasyon kuyruğu, favoriler ve gezinme geçmişi. Veriler 50 MB'ı geçmiyorsa ve ilişkisel sorgular gerektirmiyorsa — Hive, SQLite'dan daha hızlı ve basittir.
Hive, birden çok alana göre filtreleme, JOIN veya toplama işlevleri içeren sorguları desteklemez. “Bugün için önceliği 3'ün üzerinde olan tüm görevleri seç” gibi karmaşık sorgulara ihtiyacınız varsa — drift veya floor ile SQLite kullanın. Hive ayrıca belleğe yükleme nedeniyle 100 MB'den fazla veri depolamak için uygun değildir.
Hive başlatma ve bir Box açma ile başlar. Aşağıda tipik bir senaryo için temel işlemler verilmiştir — bir Flutter uygulamasında görev listesi depolama. Tüm örnekler yerel platform çağrıları olmadan çalışır.
Hive'ı kullanmadan önce, main işlevinde Hive.initFlutter() çağrılmalıdır. Ardından Hive.openBox() aracılığıyla bir Box açın — sonuç, okuma ve yazma için hazır bir Box örneği olacaktır.
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
void async main() {
await Hive.initFlutter();
final settingsBox = await Hive.openBox('settings');
runApp(MyApp());
}
Box, put, get, delete yöntemlerini ve tüm girişleri dolaşmak için bir yineleyici sağlar. Anahtarlar ve değerler jenerikler aracılığıyla türlenir — varsayılan olarak Box<dynamic> her türü kabul eder, ancak somut bir tür belirtilmesi önerilir.
// Veri yaz
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', 'Bakkal alışverişi yap');
// Oku
final task = box.get('task_1');
// Tüm anahtarlar
final allTasks = box.values.toList();
// Sil
await box.delete('task_1');
// Box'ı temizle
await box.clear();
WatchBox, aboneleri değişiklikler hakkında bilgilendiren Box'ın bir uzantısıdır. Flutter'da bu, ValueListenableBuilder ile entegre olur: Box'daki herhangi bir değer değiştiğinde, setState çağrılmadan widget otomatik olarak yeniden oluşturulur.
final watchBox = await Hive.openBox('settings');
// Widget'ta
ValueListenableBuilder(
valueListenable: watchBox.listenable(),
builder: (context, box, _) {
final counter = box.get('counter') ?? 0;
return Text('Sayaç: $counter');
},
)
TypeAdapter, özel Dart nesnelerini serileştirmek için Hive'ın mekanizmasıdır. Adaptör, bir nesnenin ikili formata (write) ve geriye (read) nasıl dönüştürüleceğini tanımlar. json_serializable'ın aksine, TypeAdapter yansıma gerektirmez ve daha hızlıdır.
Adaptör, TypeAdapter
// Veri modeli
class Task {
final String title;
final bool isCompleted;
Task({required this.title, this.isCompleted = false});
}
// TypeAdapter
class TaskAdapter extends TypeAdapter<Task> {
@override
final int typeId = 0;
@override
Task read(BinaryReader reader) {
return Task(
title: reader.readString(),
isCompleted: reader.readBool(),
);
}
@override
void write(BinaryWriter writer, Task obj) {
writer.writeString(obj.title);
writer.writeBool(obj.isCompleted);
}
}
Çok sayıda modeli olan projeler için Hive, hive_generator ve build_runner sağlar. Sınıfta @HiveType ve alanlarda @HiveField ek açıklamaları adaptörü otomatik olarak oluşturur. Bu, modelde 10'dan fazla alan olduğunda kullanışlıdır — manuel read/write yazmak zahmetli hale gelir.
Hive, disk yerine bellekten okur ve saniyede 30.000 işleme kadar hız sağlar. Optimizasyon için: Box'ı bir kez açın ve uygulama genelinde yeniden kullanın, openBox'ı tekrar tekrar çağırmayın. Başlatmadan sonra Hive.box() (senkron alıcı) kullanın — yeni bir örnek oluşturmadan zaten açılmış olan Box'ı döndürür.
Hive, popüler Flutter durum yöneticileriyle kolayca entegre olur. Provider için, başlatma sırasında Box'dan veri okuyan ve listenable aracılığıyla güncellenen ChangeNotifierProvider kullanın. Riverpod için, WatchBox'a abone olan bir StreamProvider uygundur. Bu kombinasyon, manuel setState çağrıları olmadan Hive'daki her veri değişikliğinde tepkisel UI güncellemeleri sağlar. Tipik bir Flutter projesinde, bu mimari global bir tekil olmadan ekranlar arasında durum senkronizasyonuna olanak tanır.
Sıkça Sorulan Sorular
Hive saf Dart üzerinde çalışır, bu nedenle herhangi bir Dart projesinde kullanılabilir: sunucu tarafı (Dart VM), konsol veya AngularDart. Flutter için, depolama yollarının başlatılması için ek olarak hive_flutter gerekir.
Hive, Box açılırken encryptionKey parametresi aracılığıyla AES-256 şifrelemesini destekler. Anahtar 32 baytlık bir dize olmalıdır. Şifrelenmiş bir Box, anahtar olmadan okunamaz — veriler dosya düzeyinde korunur.
Isar, aynı yazar (Simon Leiter) tarafından Hive'ın halefidir. Isar daha hızlıdır, dizinleri, ilişkileri ve karmaşık sorguları destekler. Ancak Hive, Isar'ın ilişkisel yeteneklerinin gerekli olmadığı basit senaryolar ve minimum bağımlılığın önemli olduğu projeler için geçerliliğini korur.
Hive'ın yerleşik geçişleri yoktur. TypeAdapter yapısı değişirse, eski veriler seri durumdan çıkarılmaz. Çözüm: adaptörün typeId değerini artırın ve kodda manuel bir geçiş yazın veya yeni bir anahtar yazmadan önce eski anahtar için delete kullanın.
Hive, Box'ı tamamen belleğe yükler. Önerilen sınır Box başına 50–100 MB'dir. Bunun aşılması, Box açılırken gecikmelere ve artan RAM tüketimine neden olabilir. Daha büyük hacimler için birden çok Box veya tembel yükleme ile LazyBox kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun