2016-03-20 14 views
2

Gewusst wie: Haben verschachtelte Listen in SQLite-net-Erweiterungen
Antwort gefunden: Halten Sie die Frage als ein Beispiel dafür, wie es zu tun.
Das Problem, das ich stieß, war nicht sqlite-net-extensions verwandt, aber ich behalte die Frage für den Kontext.Gewusst wie: Verschachtelte Listen in SQLite-Net-Erweiterungen

[Alt Question] ich ein Problem mit TwinCoders SQLite-net Erweiterungen haben.
Ich versuche, ein Series-Objekt in der Datenbank einzufügen:

ich die Db.InsertWithChildren(SelectedSeriesObject,recursive:true) Methode bin.
Das Serienobjekt wird entsprechend mit seinen Attributen hinzugefügt.
Alle Episoden sind auch hinzugefügt, keine Probleme dort.

Das Problem ist die BaseSeason.
Es fügt nur eine Saison-Objekt, das (aus irgendeinem Grund) die letzte Saison Objekt der Liste der Jahreszeiten ist in der Serie

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

Gibt es jemanden mit Erfahrung in Bezug auf verschachtelte Beziehungen in SQLite-Vernetzung Erweiterungen, die wissen, wie man das macht oder sieht, was ich falsch gemacht habe?

Intended Relation

Antwort

2

So in Bezug auf verschachtelte Listen in SQLite-net-Erweiterungen zu schreiben:

Mein Problem stellte sich heraus, das zu in Beziehung gesetzt werden, wie ich die Erstellung dieser Objekte behandeln, dies nicht ist bedeutet im Zusammenhang mit sqlite-net-Erweiterungen. Also mein Schlechter!

Das bedeutet, dass das Beispiel der Fragen gültig ist und funktioniert. (Getestet habe ich es natürlich)

  • die Einheiten für die Datenbank einrichten:
    Das Beispiel in meiner Frage gezeigt, mit einer Serienklasse, Staffel-Klasse und Folge-Klasse, ist der richtige Weg der Einstellung es auf.

  • Einfügen in die Datenbank:
    Wenn Sie sich fragen, wie ein Objekt ähnlich wie meine Serie Objekt einfügen (mit verschachtelten Listen), zu verwenden:
    db.InsertWitchChildren(yourObject, recursion: true)
    Hier ist ein erweitertes Beispiel:

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

Side Hinweis:
Die Beispiel verwendet eine statische Eigenschaft für die Klasse mit der Verbindungszeichenfolge.Wie so:

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

Refrain von diesen tun, ist es nicht wirklich das Beste, was zu tun, da Sie using für die SQLiteConnection verwenden soll, sicherstellen, dass es angeordnet ist, wenn Sie mit ihm fertig sind.

Weitere Informationen über: sqlite-net-extentions

[UPDATE]: Weiterer Ausbau der verschachtelten Listen in SQLite-net Erweiterungen Handhabung:

  • Tabellen löschen mit Kindern:
    Dieses recht ist Einfach, aber ich verbrachte eine gute und eine halbe Stunde damit, es herauszufinden.
    Verwenden Sie einfach:
    Für Listen/Arrays: db.DeleteAll(yourCollection, recursion: true)
    Für einzelne Objekte: db.Delete(yourObject, true);
    Als exmaple: hier ist meine Implementierung einer Methode, die eine Liste löschen wird
    (BaseSeries die Klasse in der ursprünglichen Frage Frage gezeigt):

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

    Die BaseMovie Klasse ist eine einfache Einheit, benötigt Rekursion nicht, da sie keine Kinder hält.