Şema
Isar koleksiyonlarıyla veri modellerinizi tanımlayın
Şema
Isar ile uygulama verinizi sakladığınızda koleksiyonlarla çalışırsınız. Koleksiyon, veritabanı tablosu gibidir ve yalnızca tek bir Dart nesne türünü içerebilir.
Koleksiyonun Anatomisi
Her Isar koleksiyonunu @collection veya @Collection() ile anotasyonlayarak tanımlarsınız.
@collection
class User {
Id? id;
String? firstName;
String? lastName;
}Bir alanı kalıcı kılmak için Isar'ın ona erişebilmesi gerekir. Alanı public yapın veya getter/setter sağlayın.
Veri Türleri
Isar aşağıdaki veri türlerini destekler:
Primitif Türler
@collection
class PrimitiveTypes {
PrimitiveTypes(this.id);
final int id;
bool? boolValue;
int? intValue;
double? doubleValue;
DateTime? dateValue;
String? stringValue;
}Listeler
@collection
class ListTypes {
ListTypes(this.id);
final int id;
List<bool>? boolList;
List<int>? intList;
List<double>? doubleList;
List<DateTime>? dateList;
List<String>? stringList;
}Listeler null değer içeremez. Bunun yerine nullable türler kullanın.
Enum'lar
Isar Plus, Dart enum'larını iki depolama stratejisiyle destekler:
Varsayılan olarak, enum'lar indekslerine (ordinal) göre depolanır. Herhangi bir annotation olmadan enum'u doğrudan kullanın:
enum Status { active, inactive, pending }
@collection
class Task {
Task(this.id);
final int id;
Status? status; // 0, 1 veya 2 olarak depolanır
}Depolanan değerler:
Status.active→0Status.inactive→1Status.pending→2
Enum değerlerinin sırasını değiştirirseniz, mevcut depolanan veriler farklı enum değerlerine eşlenecektir. Kararlılık için yeni değerleri sona ekleyin veya özel değerler kullanın.
Daha fazla kontrol için, enum'unuzda bir alan tanımlayın ve @enumValue ile işaretleyin. Bu alanın değeri depolama için kullanılacaktır:
enum Status {
active(1),
inactive(2),
pending(3);
const Status(this.code);
@enumValue
final int code;
}
@collection
class Task {
Task(this.id);
final int id;
Status? status; // 1, 2 veya 3 olarak depolanır
}@enumValue için desteklenen tipler:
byte- tek bayt olarak depolanırshort- 16-bit tamsayı olarak depolanırint- 32-bit tamsayı olarak depolanırString- metin olarak depolanır
// String tabanlı enum örneği
enum Priority {
low('LOW'),
medium('MEDIUM'),
high('HIGH');
const Priority(this.name);
@enumValue
final String name;
}Isar v3'ten Geçiş
Isar v3'teki @enumerated ve @Enumerated(EnumType.ordinal/name)
annotation'ları artık mevcut değildir. Ordinal depolama için düz enum'ları
veya özel değerler için @enumValue kullanın.
Gömülü Nesneler
@embedded
class Address {
String? street;
String? city;
String? country;
}
@collection
class Person {
Person(this.id);
final int id;
String? name;
Address? address;
List<Address>? addresses;
}Id'ler
Her koleksiyon nesneleri benzersiz tanımlamak için bir Id alanına ihtiyaç duyar.
@collection
class User {
User(this.id);
final int id;
String? name;
}Otomatik artan ID'ler için, ekleme sırasında collection.autoIncrement() metodunu kullanın:
isar.write((isar) {
final user = User(isar.users.autoIncrement());
isar.users.put(user);
});Özel ID'ler
@collection
class User {
User(this.id);
final int id; // ID'yi siz yönetirsiniz
String? name;
}Alan Anotasyonları
@Index
Sorgu performansını iyileştirmek için indeks oluşturun:
@collection
class User {
User(this.id);
final int id;
@Index()
String? email;
@Index(type: IndexType.value)
String? username;
@Index(caseSensitive: false)
String? name;
}@Ignore
Alanları depolamadan hariç tutun:
@collection
class User {
User(this.id);
final int id;
String? name;
@ignore
String? temporaryData; // Saklanmaz
}@Name
Veritabanında alan adını değiştirin:
@collection
class User {
User(this.id);
final int id;
@Name("user_name")
String? name;
}@Size
String boyutunu sınırlandırın:
@collection
class User {
User(this.id);
final int id;
@Size(max: 100)
String? shortText;
@Size(max: 1000)
String? longText;
}Bileşik İndeksler
Birden fazla alan üzerinde indeks oluşturun:
@collection
@Index(composite: ['lastName', 'age'])
class User {
User(this.id);
final int id;
String? firstName;
String? lastName;
int? age;
}İlişkileri Modellemek
Isar Plus v4, çalışma zamanı link tipleri yerine gömülü nesneler ve açık ID alanlarıyla ilişkileri modeller. Depodan alınmış örnekler görmek için İlişkiler sayfasına göz atın.
Migration
Isar çoğu durumda şema geçişlerini otomatik yönetir:
- Yeni alan eklemek
- Alan kaldırmak
- Alan türünü değiştirmek (veri kaybıyla)
- İndeks eklemek/kaldırmak
Var olan bir alanın türünü değiştirmek, o alan için veri kaybına yol açar.
Sonraki Adımlar
Son Güncelleme