2016-03-20 1 views
2

Comment: listes de tâches imbriquées dans les extensions sqlite-net-
Réponse trouvée: Garder la question comme un exemple de la façon de le faire.
Le problème que j'ai rencontré n'était pas lié à sqlite-net-extensions, mais je garde la question en contexte.Comment: listes imbriquées dans les extensions SQLite-Net

[Old Question] J'ai un problème avec TwinCoders extensions SQLite-net.
J'essaie d'insérer un objet de la série dans ma base de données:

J'utilise la méthode Db.InsertWithChildren(SelectedSeriesObject,recursive:true).
L'objet Series est ajouté en conséquence avec ses attributs.
Tous les épisodes sont ajoutés ainsi, pas de problèmes là-bas.

Le problème est la raison de base.
Il n'insérera un objet saison, ce qui est (pour une raison quelconque) le dernier objet de la saison de la liste des saisons dans la série

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

Est-ce qu'il ya quelqu'un avec l'expérience en ce qui concerne les relations imbriquées dans sqlite-Net- extensions qui sait comment faire ce travail ou voir ce que j'ai fait de mal?

Intended Relation

Répondre

2

donc en ce qui concerne l'écriture des listes imbriquées dans sqlite-net-extensions:

Mon problème avéré l'être lié à la façon dont je gère la création de ces objets, ce n'est pas signifie lié aux extensions sqlite-net. Donc mon mal!

Cela signifie que l'exemple de questions est valide et fonctionne. (Je l'ai testé bien sûr)

  • Mise en place des entités de la base de données:
    L'exemple montré dans ma question, avec une classe de la série, la classe de la saison et la classe Episode, est la bonne façon de mettre en vers le haut.

  • insertion dans la base de données:
    Si vous vous demandez comment insérer un objet similaire à mon objet de la série (avec des listes imbriquées), utilisez:
    db.InsertWitchChildren(yourObject, recursion: true)
    Voici un exemple étendu:

    public void AddSeries() 
    {    
        MediaDB.db.CreateTable<BaseSeries>(); 
        MediaDB.db.CreateTable<BaseSeason>(); 
        MediaDB.db.CreateTable<BaseEpisode>(); 
    
        MediaDB.db.InsertWithChildren(SelectedSeries, recursion: true);    
    } 
    

Side note:
Le exemple utilise une propriété statique sur la classe avec la chaîne de connexion.Comme si:

public class MediaDB 
    { 
     public static SQLiteConnection db => new SQLiteConnection(new SQLitePlatformGeneric(),"Media.db"); 
    } 

Abstenez-vous de faire ce il est pas vraiment la meilleure chose à faire, puisque vous devez utiliser using pour le SQLiteConnection, en vous assurant qu'il est disposé à une fois que vous avez terminé avec elle.

plus d'informations sur: sqlite-net-extentions

[UPDATE]: L'expansion de la manipulation des listes imbriquées dans les extensions sqlite-net:

  • Suppression des tables avec des enfants:
    C'est tout à fait simple, mais j'ai passé une bonne heure et demi à le découvrir de toute façon.
    utiliser Just:
    Pour les listes/tableaux: db.DeleteAll(yourCollection, recursion: true)
    Pour les objets simples: db.Delete(yourObject, true);
    En tant exmaple: voici ma mise en œuvre d'une méthode qui supprime une liste
    (BaseSeries est la classe décrite dans la question de la question initiale):

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

    La classe BaseMovie est simple entité unique, récursivité est pas nécessaire car il ne détient pas les enfants.