繁体   English   中英

SQLite-Net扩展中的多个(相关)类类型的数组

[英]Arrays of multiple (related) class types in SQLite-Net Extensions

有没有办法从SQLite.Net Extensions中的同一父类继承不同类类型的集合? 理想情况下,我希望有一个符合接口或抽象类的对象数组,但是我什至无法使标准类的子类型起作用。

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; }
}

我不能得到上述返回multiplesTypeAllowed的空数组以外的任何东西。 如果我不使父类不抽象并实例化它,则该方法有效,但即使该子类也不起作用。 有什么方法可以使继承与SQLite.Net一起使用?

干杯。

当使用GetWithChildren获取ActivityCategory对象时,内部sqlite-net使用反射来为每个子级调用new ActivateCategory()然后调用new SomeAbstractClass() 这就是为什么sqlite-net库中的所有泛型都具有where T : new()约束的原因。 这就是类为抽象类时得到空数组的原因。 它只是无法通过库实例化。 如果要将不同类型的实例存储在同一数组中,则无法为sqlite-net猜测每次应使用哪种类型。 我当然不知道您的应用程序的逻辑,但是我认为您不能避免手动编写查询-不使用sqlite-net扩展。 例如,如果您的基本类是Vehicle,而Car&Truck是派生类,则可以使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM