如何:在sqlite-net-extensions中嵌套列表
回答:保留问题作为如何做的例子。
我遇到的问题不是sqlite-net-extensions相关,但我保留了上下文的问题。
[旧问题] 我遇到了TwinCoders SQLite-net扩展的问题 我正在尝试将一个Series对象插入到我的数据库中:
我正在使用Db.InsertWithChildren(SelectedSeriesObject,recursive:true)
方法
系列对象相应地添加了它的属性
所有剧集也都添加了,没有任何问题。
问题是BaseSeason 它只会插入一个Season对象,这是(出于某种原因)系列中季节列表的最后一个季节对象
public class BaseSeries : BaseMedia
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
[Indexed]
public int ShowId { get; set; }
public string FirstAirDate { get; set; }
public string LastAirDate { get; set; }
public string Status { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<BaseSeason> Seasons { get; set; }
/// <summary>
/// TvShow = 0, Anime = 1
/// </summary>
public int SeriesType { get; set; }
}
public class BaseSeason
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
[ForeignKey(typeof(BaseSeries))]
public int SeasonId { get; set; }
public int SeasonNumber { get; set; }
public int NumberOfEpisodes { get; set; }
public string Plot { get; set; }
public string Poster { get; set; }
public string AirDate { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<BaseEpisode> Episodes { get; set; }
[ManyToOne]
public BaseSeries BaseSeries { get; set; }
}
public class BaseEpisode
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
[ForeignKey(typeof(BaseSeason))]
public int EpisodeId { get; set; }
public string Title { get; set; }
public string Plot { get; set; }
public string Poster { get; set; } //still path
public string AirDate { get; set; }
public int EpisodeNumber { get; set; }
public int SeasonNumber { get; set; }
public string SeriesName { get; set; }
[ManyToOne]
public BaseSeason BaseSeason { get; set; }
}
是否有人对sqlite-net-extensions中的嵌套关系有经验,知道如何使这项工作或看到我做错了什么?
答案 0 :(得分:3)
关于在sqlite-net-extensions中编写嵌套列表:
我的问题与我如何处理这些对象的创建有关,这与sqlite-net扩展无关。所以我的坏!
这意味着问题示例有效且有效。 (我当然测试了它)
设置数据库的实体:
我的问题中显示的示例,包括Series类,Season类和Episode类,是设置它的正确方法。
插入数据库:
如果您想知道如何插入类似于我的Series对象的对象(使用嵌套列表),请使用:
db.InsertWitchChildren(yourObject, recursion: true)
这是一个扩展示例:
public void AddSeries()
{
MediaDB.db.CreateTable<BaseSeries>();
MediaDB.db.CreateTable<BaseSeason>();
MediaDB.db.CreateTable<BaseEpisode>();
MediaDB.db.InsertWithChildren(SelectedSeries, recursion: true);
}
旁注:
该示例在类上使用带有连接字符串的静态属性。像这样:
public class MediaDB
{
public static SQLiteConnection db => new SQLiteConnection(new SQLitePlatformGeneric(),"Media.db");
}
不要这样做这不是最好的事情,因为您应该将using
用于SQLiteConnection,确保在完成后将其处理掉。
[更新]:在sqlite-net扩展中进一步扩展处理嵌套列表:
删除包含子项的表:
这很简单,但无论如何我花了一个半小时的时间来计算它
只需使用:
对于列表/数组:db.DeleteAll(yourCollection, recursion: true)
对于单个对象:db.Delete(yourObject, true);
作为一个例子:这是我实现的删除列表的方法
(BaseSeries是原始问题中显示的类):
public static void RemoveCollection<T>(List<T> collection)
{
using (db)
{
if (typeof(T) == typeof(BaseMovie))
{
db.DeleteAll(collection);
}
if (typeof(T) == typeof(BaseSeries))
{
db.DeleteAll(collection, recursion: true);
}
}
}
BaseMovie类是一个简单的单个实体,不需要递归,因为它不包含子项。