Kısıtlamalar
Platforma özgü kısıtlar ve sınırlamalar
Kısıtlamalar
Isar Plus; mobil, masaüstü ve web platformlarında çalışır. Her platformun farklı özellikleri ve sınırlamaları vardır.
Platform Genel Bakış
Platformlar: iOS, Android, macOS, Linux, Windows
Kısıtlar
- String ön ek where cümleleri ilk 1024 baytla sınırlıdır
- Maksimum nesne boyutu: 16MB
VM platformlarında sınırlamalar minimum düzeydedir ve tüm özellikler desteklenir!
Platformlar: Chrome, Firefox, Safari, Edge
Depolama Arka Uçları
OPFS (Modern)
Chrome, Edge (v102+)
- Hızlı, yerel seviyede performans
- Kalıcı depolama
- Tam SQLite uyumluluğu
IndexedDB (Yedek)
Safari, Firefox, eski tarayıcılar
- Bazı kısıtlamalar geçerli
- OPFS'den daha yavaş
- İyi uyumluluk
Kısıtlar
// ❌ Async API'ler web'de desteklenmez (isolate gerektirir)
await isar.writeAsync((isar) => isar.users.put(user));
await isar.users.getAsync(1);
// ❌ Watcher'lar web'de desteklenmez
isar.users.watchLazy().listen((_) {});
isar.users.watchObject(1).listen((user) {});
// ✅ Sync API'leri kullanın
isar.write((isar) => isar.users.put(user));
final user = isar.users.get(1);Async işlemler isolate gerektirir ve web'de mevcut değildir. Senkron API'leri kullanın!
Genel Kısıtlar
- Çok büyük transaction'lar desteklenmez (100MB altında tutun)
- Link'ler lazy load edilir (ilk erişimde küçük bir ek yük)
- Gömülü nesneler başka gömülü nesneler içeremez (tek seviye)
VM Kısıtları
String İndeksleme
Bir string'in yalnızca ilk 1024 baytı indekslenir:
@collection
class Article {
Id? id;
@Index()
late String title; // ✅ Genellikle yeterli
@Index()
late String content; // ⚠️ Sadece ilk 1024 bayt indekslenir
}Uzun metinlerde tam metin araması için çok girişli indeks desenini kullanın.
Nesne Boyutu
Maksimum nesne boyutu 16MB'dir:
@collection
class LargeDocument {
Id? id;
// ⚠️ Büyük veriyle dikkatli olun
late List<int> fileData;
}Büyük dosyaları Isar dışında saklayın ve veritabanında yalnızca referanslarını tutun.
Web Kısıtları
API Uyumluluğu
// ❌ Watcher'lar (native isolate gerektirir)
isar.users.watchLazy().listen((_) {});
isar.users.watchObject(1).listen((user) {});
isar.users.watchDetailed().listen((change) {});
// ❌ Metin işlemleri
Isar.splitWords('hello world');
isar.users.where().nameMatches('pattern*');// ✅ Senkron işlemler
final user = isar.users.get(1);
final users = isar.users.getAll([1, 2, 3]);
isar.write((isar) => isar.users.put(user));
isar.read((isar) => isar.users.where().findAll());
// ✅ Async işlemler (web'de ana thread'de çalışır)
await isar.writeAsync((isar) => isar.users.put(user));
await isar.readAsync((isar) => isar.users.get(1));
await isar.users.getAsync(1);
await isar.users.getAllAsync([1, 2, 3]);
// ✅ Filtreler ve sorgular
isar.users.where()
.nameContains('John')
.findAll();
// ✅ Where cümleleri
isar.users.where()
.nameEqualTo('John')
.findAll();Web Async Davranışı: Web'de writeAsync, readAsync, getAsync vb.
ana thread'de çalışır (ayrı isolate'de değil). Bu, native platformlardaki
performans avantajlarını sağlamaz, ancak kodunuz tüm platformlarda
değişiklik olmadan çalışır.
IndexedDB Yedek Kısıtları
OPFS mevcut olmadığında IndexedDB ek kısıtlamalara sahiptir:
// ⚠️ Dönen değerler farklı olabilir
await isar.writeAsync((isar) async {
final count = isar.users.deleteAll([1, 2, 3]);
// OPFS: kesin sayıyı döner
// IndexedDB: farklı değer dönebilir
});
// ⚠️ clear() auto-increment'i sıfırlamaz
await isar.writeAsync((isar) async {
isar.users.clear();
});
// OPFS: sonraki ID 1 olur
// IndexedDB: önceki değerden devam ederŞema Geçişleri
// ⚠️ Web'de doğrulama daha gevşek
@collection
class User {
Id? id;
late String name;
// Tür değişimi daha az kontrol edilir
late int age; // Önceden String idi
}Yayın öncesi web'de şema değişikliklerini iki kez kontrol edin!
Metin İşlemleri
// ❌ Web'de yok
final words = Isar.splitWords('Hello World');
// ❌ Wildcard eşleşme yok
await isar.users.where()
.nameMatches('John*')
.findAll();
// ✅ Alternatif desenler kullanın
await isar.users.where()
.nameStartsWith('John')
.findAllAsync();
await isar.users.where()
.nameContains('John')
.findAllAsync();Geçici Çözümler
Büyük String'ler
// İçeriğin tamamını indekslemek yerine
@collection
class Article {
Id? id;
late String title;
late String content;
// Aranabilir anahtar kelimeler üretin
@Index(type: IndexType.value)
late List<String> keywords;
}
// Kaydetmeden önce anahtar kelimeler oluşturun
final article = Article()
..title = 'My Article'
..content = 'Long content...'
..keywords = generateKeywords(content);Dosya Depolama
@collection
class Document {
Id? id;
late String name;
// İçeriği değil yolu saklayın
late String filePath;
late int fileSize;
}
// Dosyayı ayrı saklayın
final file = File('path/to/file.pdf');
final document = Document()
..name = 'Document'
..filePath = file.path
..fileSize = await file.length();Web Async Deseni
// Platform-özgü kod
class IsarHelper {
static Future<User?> getUser(Isar isar, int id) async {
if (kIsWeb) {
// Web'de her zaman sync kullan
return isar.users.get(id);
} else {
// Native'de sync veya async kullanılabilir
return isar.users.getSync(id);
}
}
}Platformlar Arası Metin Arama
@collection
class Product {
Id? id;
late String name;
// Küçük harf kopyasını saklayın
@Index(caseSensitive: false)
late String searchName;
}
// Kaydetmeden önce
product.name = 'iPhone 15 Pro';
product.searchName = product.name.toLowerCase();
// Sorgu tüm platformlarda çalışır
await isar.products
.where()
.searchNameContains('iphone')
.findAll();Platform Tespiti
import 'package:flutter/foundation.dart';
void configureIsar() {
if (kIsWeb) {
print('Web üzerinde sınırlamalarla çalışıyor');
// Yalnızca async API'ler
} else {
print('Yerel platformda çalışıyor');
// Performans için sync API'ler kullanılabilir
}
}Tarayıcı Desteği
| Tarayıcı | Sürüm | Depolama | Performans |
|---|---|---|---|
| Chrome | 102+ | OPFS | Mükemmel |
| Edge | 102+ | OPFS | Mükemmel |
| Safari | Tümü | IndexedDB | İyi |
| Firefox | Tümü | IndexedDB | İyi |
OPFS, Chromium tarayıcılarında neredeyse yerel performans sunar!
En İyi Uygulamalar
-
Platformlar Arası Kod Yazın
// ✅ Sync her yerde çalışır isar.write((isar) => isar.users.put(user)); final user = isar.users.get(1); // ⚠️ Async sadece native'de çalışır (mobil/masaüstü) // Web'de UnsupportedError fırlatır await isar.writeAsync((isar) => isar.users.put(user));// Platform-farkında desen if (kIsWeb) { isar.write((isar) => isar.users.put(user)); } else { await isar.writeAsync((isar) => isar.users.put(user)); } -
Hedef Platformlarda Test Edin
- Farklı tarayıcılarda web yapıları
- Mobil cihazlarda performans
- Masaüstü yapıları
-
Platform Farklarını Yönetin
if (kIsWeb) { // Web'e özgü mantık } else { // Native'e özgü mantık } -
Nesneleri Küçük Tutun
// Büyük veriyi değil referansı saklayın @collection class Photo { Id? id; late String url; // Görsel byte'ları değil late String thumbnailUrl; }
Geçiş Notları
Isar 3'ten geçerken:
Isar Plus, LMDB yerine SQLite kullanır. Bazı davranışlar hafifçe farklı olabilir.
Ayrıntılar için Geçiş Rehberi.
Sonraki Adımlar
Son Güncelleme