Isar Plus

Ş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.active0
  • Status.inactive1
  • Status.pending2

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ır
  • short - 16-bit tamsayı olarak depolanır
  • int - 32-bit tamsayı olarak depolanır
  • String - 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