2016-11-25 7 views
4

私は自分自身を教えようとしていますので、私はモバイルアプリケーション開発にはとても新しいです。 私はしようとしているこの特定のアプリケーションのXamarinとsqlite-net(拡張機能)を使用しています。OneToManyの関係がうまく動作しないようです。

は、私は今、私の活動で、私はこのすべてが動作しているようですし、私にエラーを与えないこの

 SQLiteConnection db = new SQLiteConnection(new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid(), path); 

     db.CreateTable<Player>(); 
     db.CreateTable<Game>(); 

     Game game = new Game(); 
     game.Name = "Stupid game"; 

     Game game2 = new Game(); 
     game2.Name = "Fun game"; 

     Game game3 = new Game(); 
     game3.Name = "Amazing game"; 

     db.Insert(game); 
     db.Insert(game2); 
     db.Insert(game3); 

     Player player = new Player(); 
     player.Name = name; //Getting this from a input field 
     db.Insert(player); 

     Random random = new Random();      
     player.GameId = random.Next(1, 3); 
     Game game = db.Get<Game>(player.GameId); 
     player.Game = game; 

     db.UpdateWithChildren(player); 

     game.Players.Add(player); 
     db.UpdateWithChildren(game); 

のようなものを持っているOneToMany関係

class Game 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    [OneToMany(CascadeOperations = CascadeOperation.All)] 
    public List<Player> Players { get; set; } 

    public Game() 
    { 
     Players = new List<Player>(); 
    } 
} 

class Player 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 
    [MaxLength(8)] 
    public string Name { get; set; } 

    [ForeignKey(typeof(Game))] 
    public int GameId { get; set; } 

    [ManyToOne] 
    public Game Game { get; set; } 

} 

との2クラスがあります。これをデバッグすると、実際にプレイヤーにゲームが追加されていることがわかります。私は

List<Player> players = db.Table<Player>().ToList(); 

、次の文を使用して、すべてのプレイヤーを取得するにはどこかにしようとすると、私はそのプロパティを読み込むしようとすると、しかし、彼らは突然、もはやゲームを持っているし、私のプログラムがクラッシュしないでください。

私はUpdateWithChildrenとInsertWithChildrenでいくつかのことを試しましたが、役に立たないです。私が間違っていることは何か、それとも私がインストールしていないものか、それとも何か? 本当に助けに感謝します。

+1

'WithChildren'読み込みメソッドを試しましたか? – redent84

+1

'UpdateWithChildren'に再帰的な2番目のパラメータが必要と考えられます。存在しない場合は、 'read'メソッドで' conn.GetWithChildren (識別子、再帰的:true); ' –

+0

Ah GetWithChildrenが本当に正しいです。ありがとう!! – Jinse

答えて

0

sqlite-net extensionsは、子関係を取得する場合は、通常のsqlite-netメソッドを使用することに戻ることはできません。したがって、あなたはここに自分のドキュメントを追跡する必要があります:

https://bitbucket.org/twincoders/sqlite-net-extensions

彼らはあなたが一般的なdb.Table<T>方法に比べて使用する必要がありますするなどGetChildren, UpdateWithChildren, etcような方法を提供します。

再帰メソッドを使用する場合は、オプションのrecursiveパラメータを指定してください。

したがって、あなたはの線に沿って何かをすることができる必要があります:

conn.GetWithChildren<Player>(identifier, recursive: true) 

は、そうでない場合は上記のリンク先のドキュメントのCascade Operationsセクションにもっとアップ読み。

関連する問題