![](/img/trans.png)
[英]How to iterate throught multiple releated tables with SQLite-Net Extensions?
[英]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.