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)。