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'에 재귀 적 두번째 매개 변수가 있다고 생각합니다. 만약 거기에 없다면'conn'GetWithChildren (식별자, 재귀 : 참)을 통해'read' 메쏘드에서 그것을해야 할 것입니다;' –

+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 섹션에 더 읽어.