SQLite-Net 扩展中多个(相关)class 类型的数组
Arrays of multiple (related) class types in SQLite-Net Extensions
有没有办法在 SQLite.Net 扩展中拥有从同一父 class 继承的不同 class 类型的集合?理想情况下,我希望有一个符合接口或抽象 class 的对象数组,但是我什至无法让标准 classes 的子类型工作。
public class ActivityCategory
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Title { get; set; }
public string Icon { get; set; }
public bool Recommended { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.All)]
public SomeAbstractClass[] multipleTypesAllowed { get; set; }
}
public abstract class SomeAbstractClass
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string SomeValue { get; set; }
[ForeignKey(typeof(ActivityCategory))]
public int ActivityCategoryId { get; set; }
[ManyToOne(CascadeOperations = CascadeOperation.All)]
public ActivityCategory Category { get; set; }
}
除了 multipleTypesAllowed 的空数组之外,我无法将上述内容 return 任何其他内容。如果我让父 class 不抽象并实例化它,它会起作用,但即使是子 class 也不起作用。有什么方法可以让 SQLite.Net 继承吗?
干杯。
当您使用 GetWithChildren 获取 ActivityCategory 对象时,sqlite-net 在内部使用反射调用 new ActivateCategory()
,然后为每个子对象调用 new SomeAbstractClass()
。这就是为什么 sqlite-net 库中的所有泛型都有约束 where T : new()
。
这就是当你的 class 是抽象的时候你得到一个空数组的原因。它只是不能被库实例化。
如果你想在同一个数组中存储不同类型的实例,你不能让 sqlite-net 为你猜测它每次应该使用哪种类型。
当然,我不知道您的应用程序的逻辑,但我认为您无法避免手动编写查询 - 不使用 sqlite-net 扩展。
例如,如果您的基础 class 是 Vehicle,而 Car & Truck 是派生的 classes,您可以使用:
db.CreateTable<Vehicle>();
Car c = new Car();
Truck t = new Truck();
db.Insert(c, typeof(Vehicle));
db.Insert(t, typeof(Vehicle));
...
List<Car> cars = db.Query<Car>("select * from Vehicle where VehicleType = ?", VehicleTypes.Car);
List<Truck> trucks = db.Query<Truck>("select * from Vehicle where VehicleType = ?", VehicleTypes.Truck);
然后您可以将两个列表合并为一个 Vehicle 列表,并将此列表添加到您的父实例(在您的示例中为 ActivityCategory)。
有没有办法在 SQLite.Net 扩展中拥有从同一父 class 继承的不同 class 类型的集合?理想情况下,我希望有一个符合接口或抽象 class 的对象数组,但是我什至无法让标准 classes 的子类型工作。
public class ActivityCategory
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Title { get; set; }
public string Icon { get; set; }
public bool Recommended { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.All)]
public SomeAbstractClass[] multipleTypesAllowed { get; set; }
}
public abstract class SomeAbstractClass
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string SomeValue { get; set; }
[ForeignKey(typeof(ActivityCategory))]
public int ActivityCategoryId { get; set; }
[ManyToOne(CascadeOperations = CascadeOperation.All)]
public ActivityCategory Category { get; set; }
}
除了 multipleTypesAllowed 的空数组之外,我无法将上述内容 return 任何其他内容。如果我让父 class 不抽象并实例化它,它会起作用,但即使是子 class 也不起作用。有什么方法可以让 SQLite.Net 继承吗?
干杯。
当您使用 GetWithChildren 获取 ActivityCategory 对象时,sqlite-net 在内部使用反射调用 new ActivateCategory()
,然后为每个子对象调用 new SomeAbstractClass()
。这就是为什么 sqlite-net 库中的所有泛型都有约束 where T : new()
。
这就是当你的 class 是抽象的时候你得到一个空数组的原因。它只是不能被库实例化。
如果你想在同一个数组中存储不同类型的实例,你不能让 sqlite-net 为你猜测它每次应该使用哪种类型。
当然,我不知道您的应用程序的逻辑,但我认为您无法避免手动编写查询 - 不使用 sqlite-net 扩展。
例如,如果您的基础 class 是 Vehicle,而 Car & Truck 是派生的 classes,您可以使用:
db.CreateTable<Vehicle>();
Car c = new Car();
Truck t = new Truck();
db.Insert(c, typeof(Vehicle));
db.Insert(t, typeof(Vehicle));
...
List<Car> cars = db.Query<Car>("select * from Vehicle where VehicleType = ?", VehicleTypes.Car);
List<Truck> trucks = db.Query<Truck>("select * from Vehicle where VehicleType = ?", VehicleTypes.Truck);
然后您可以将两个列表合并为一个 Vehicle 列表,并将此列表添加到您的父实例(在您的示例中为 ActivityCategory)。