Hive: nedir, NoSQL depolama ve yerel kod olmadan geliştirme

Yazar: IT Sectr Yayınlanma: 2026-03-13 Okuma süresi: 9 dk

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 — saf Dart ile NoSQL DB, yerel kod veya platform bağımlılığı yok
  • Performans — mobil cihazda saniyede 30.000 okumaya kadar
  • Tiplerne — özel nesneler için TypeAdapter, kod oluşturma gerekmez
  • Hafiflik — Android SDK veya iOS UIKit'e sıfır bağımlılık
  • Tepkisel — gerçek zamanlı değişiklik takibi için WatchBox

Hive nedir?

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 Mimarisi

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.

Yerel Çözümlere Göre Avantajlar

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 nasıl çalışır?

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.

İşlemler ve Eşzamanlılık

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 vs SharedPreferences vs SQLite

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.

ÖzellikHiveSharedPreferencesSQLite
Veri türleriHerhangi biri (TypeAdapter ile)Yalnızca ilkelSQL türleri
Okuma hızı~30.000 ops/s~5.000 ops/s~2.000 ops/s
Yerel kodGerekmezGerekli (Android)Gerekli
Web desteğiEvetHayırHayır
KarmaşıklıkDüşükMinimumOrta
TepkisellikWatchBoxHayırORM ile

Hive ne zaman seçilmeli

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 ne zaman uygun değildir

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 ile kod örnekleri

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.

Başlatma ve Box açma

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.

dart
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());
}

CRUD işlemleri

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.

dart
// 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 aracılığıyla tepkisel izleme

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.

dart
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 ve özel nesneler

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.

TypeAdapter oluşturma

Adaptör, TypeAdapter arayüzünü iki yöntemle uygular: read ve write. Sınıf, Box açılmadan önce Hive.registerAdapter() aracılığıyla kaydedilir. Her adaptöre sayısal bir kimlik atanır — tür tanımlaması için dosyada saklanır.

dart
// 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);
    }
}

Kod oluşturma yoluyla adaptör üretme

Ç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 performans optimizasyonu

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.

Provider ve Riverpod ile Hive

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, Flutter olmadan kullanılabilir mi?

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'da veriler nasıl şifrelenir?

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.

Hive, Isar'dan nasıl farklıdır?

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 şema geçişlerini destekliyor mu?

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'ın maksimum boyutu nedir?

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

  • Hive — saf Dart ile NoSQL DB, yerel kod veya platform bağımlılığı yok
  • Performans — mobil cihazlarda saniyede 30.000 okuma işlemine kadar
  • TypeAdapter — yansıma olmadan özel nesnelerin ikili serileştirilmesi
  • WatchBox — otomatik UI güncellemeleri için tepkisel değişiklik takibi
  • Platformlar arası — Android, iOS, Web, macOS, Windows, Linux kutudan çıkar
  • Şifreleme — Box dosyası düzeyinde AES-256 veri koruması
  • Öneri — Flutter ve Dart projelerinde önbellekleme, ayarlar ve küçük veri hacimleri için Hive kullanın

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.

Projeyi tartış

Ayrıca okuyun