如何:SQLite-Net 扩展中的嵌套列表
How to: Nested Lists in SQLite-Net Extensions
如何:在 sqlite-net-extensions 中做嵌套列表
找到答案:以问题为例说明如何做。
我遇到的问题与sqlite-net-extensions无关,但我保留了上下文的问题。
[老问题]
我遇到了 TwinCoders SQLite-net 扩展的问题。
我正在尝试将一个 Series 对象插入到我的数据库中:
我正在使用 Db.InsertWithChildren(SelectedSeriesObject,recursive:true)
方法。
相应地添加了 Series 对象及其属性。
所有剧集也已添加,没有问题。
问题是 BaseSeason。
它只会插入一个 Season 对象,这是(出于某种原因)系列中 Seasons 列表的最后一个 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 中的嵌套关系有经验,知道如何进行这项工作或看看我做错了什么?
因此关于在 sqlite-net-extensions 中编写嵌套列表:
我的问题原来与我如何处理这些 object 的创建有关,这与 sqlite-net 扩展无关。所以我的坏!
这意味着问题示例有效且有效。 (我当然测试过了)
正在为数据库设置实体:
我的问题中显示的示例包含系列 class、季 class 和剧集 class,是设置它的正确方法。
正在插入数据库:
如果您想知道如何插入类似于我的系列 object(带嵌套列表)的 object,请使用:
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);
}
旁注:
该示例在 class 上使用带有连接字符串的静态 属性。像这样:
public class MediaDB
{
public static SQLiteConnection db => new SQLiteConnection(new SQLitePlatformGeneric(),"Media.db");
}
不要这样做这并不是最好的做法,因为您应该对 SQLiteConnection 使用 using
,确保一旦您完成它。
[更新]:在 sqlite-net 扩展中进一步扩展处理嵌套列表:
删除表 children:
这很简单,但我还是花了一个半小时弄明白了。
只需使用:
对于 lists/arrays:db.DeleteAll(yourCollection, recursion: true)
对于单个 objects:db.Delete(yourObject, true);
举个例子:这是我实现的一个删除 List
的方法
(BaseSeries就是原题题中显示的class):
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 class 是一个简单的单一实体,不需要递归,因为它不包含 children.
如何:在 sqlite-net-extensions 中做嵌套列表
找到答案:以问题为例说明如何做。
我遇到的问题与sqlite-net-extensions无关,但我保留了上下文的问题。
[老问题]
我遇到了 TwinCoders SQLite-net 扩展的问题。
我正在尝试将一个 Series 对象插入到我的数据库中:
我正在使用 Db.InsertWithChildren(SelectedSeriesObject,recursive:true)
方法。
相应地添加了 Series 对象及其属性。
所有剧集也已添加,没有问题。
问题是 BaseSeason。
它只会插入一个 Season 对象,这是(出于某种原因)系列中 Seasons 列表的最后一个 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 中的嵌套关系有经验,知道如何进行这项工作或看看我做错了什么?
因此关于在 sqlite-net-extensions 中编写嵌套列表:
我的问题原来与我如何处理这些 object 的创建有关,这与 sqlite-net 扩展无关。所以我的坏!
这意味着问题示例有效且有效。 (我当然测试过了)
正在为数据库设置实体:
我的问题中显示的示例包含系列 class、季 class 和剧集 class,是设置它的正确方法。正在插入数据库:
如果您想知道如何插入类似于我的系列 object(带嵌套列表)的 object,请使用:
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); }
旁注:
该示例在 class 上使用带有连接字符串的静态 属性。像这样:
public class MediaDB
{
public static SQLiteConnection db => new SQLiteConnection(new SQLitePlatformGeneric(),"Media.db");
}
不要这样做这并不是最好的做法,因为您应该对 SQLiteConnection 使用 using
,确保一旦您完成它。
[更新]:在 sqlite-net 扩展中进一步扩展处理嵌套列表:
删除表 children:
这很简单,但我还是花了一个半小时弄明白了。
只需使用:
对于 lists/arrays:db.DeleteAll(yourCollection, recursion: true)
对于单个 objects:db.Delete(yourObject, true);
举个例子:这是我实现的一个删除 List
的方法 (BaseSeries就是原题题中显示的class):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 class 是一个简单的单一实体,不需要递归,因为它不包含 children.