2017-11-23 11 views
0

Realmをローカルデータベースとして使用するXamarin.Formsを使用してアプリケーションを構築していますが、私は次のことに苦労しています。レルムを使用したXamarin.Formsの多対1リレーション

アプリは、このようなJSONレスポンスを与えるAPIを消費している:

[ 
    { 
     "id": "5bf7029c-1577-4739-b37a-845cee1ef70d", 
     "name": "Test", 
     "categories": [ 
      { 
       "id": "16db7cef-2f6a-4405-a004-df15864d4dde", 
       "name": "Category 1", 
       "master_id": "5bf7029c-1577-4739-b37a-845cee1ef70d", 
       "rooms": [ 
        { 
         "id": "d9246c9f-e8bb-41a9-b9a5-e21f1838de19", 
         "category_id": "16db7cef-2f6a-4405-a004-df15864d4dde", 
         "name": "Room 1", 
        }, 
        { 
         "id": "424a592d-8cb3-42a3-acbc-dc67d1ac8ddf", 
         "category_id": "16db7cef-2f6a-4405-a004-df15864d4dde", 
         "name": "Room 2", 
        } 
       ] 
      } 
     ] 
    } 
] 

私は私のためのC#クラスを生成するQuickTypeを使用しています

public class Master : RealmObject 
{ 
    [PrimaryKey] 
    [JsonProperty("id")] 
    public string Id { get; set; } 

    [JsonProperty("categories")] 
    public IList<Category> Categories { get; } 

    [JsonProperty("name")] 
    public string Name { get; set; } 
} 

public class Category : RealmObject 
{ 
    [PrimaryKey] 
    [JsonProperty("id")] 
    public string Id { get; set; } 

    [JsonProperty("master_id")] 
    public string MasterId { get; set; } 

    [JsonProperty("rooms")] 
    public IList<Room> Rooms { get; set; } 

    [JsonProperty("name")] 
    public string Name { get; set; } 
} 

public class Room : RealmObject 
{ 
    [PrimaryKey] 
    [JsonProperty("id")] 
    public string Id { get; set; } 

    [JsonProperty("category_id")] 
    public string CategoryId { get; set; } 

    [JsonProperty("name")] 
    public string Name { get; set; } 
} 

Newtonsoftの助けを借りて、私が解析しています受信したJSONをオブジェクトとデータベースに直接渡します。

IEnumerable<Master> masters = await Task.Run(() => JsonConvert.DeserializeObject<List<Master>>(json, new JsonSerializerSettings 
{ 
    MetadataPropertyHandling = MetadataPropertyHandling.Ignore, 
    DateParseHandling = DateParseHandling.None 

})); 

realm.Write(() => 
{ 
    foreach (Master master in masters) 
    { 
     realm.Add(master); 
    } 
}); 

Sすべての作業が完了し、すべての子オブジェクトを含むMasterオブジェクトが適切に作成されます。しかし、私は親データに簡単にアクセスできる必要があります。たとえば、Room.Category.Nameのようなステートメントを使用してRoomを使用できるときに、カテゴリの名前を取得できるようにしたいとします。

私はこれを達成するためにいくつかの方法を試みましたが、これまで成功していませんでした。私は私の試みを詳述します。私は私が近くにいるかもしれないと感じているからです。

私の最初の試みは、レルムバックリンクのプロパティを使用していたとルームクラスに次の属性を追加しました:このエラーにルーム・クラスの結果に、このプロパティを追加し、しかし

[Backlink(nameof(Category.Rooms))] 
public Category Category { get; } 

を: Error CS0120: An object reference is required for the non-static field, method, or property 'Room.Category' (CS0120)を。 RealmのWebサイトで示されている例を見ると、子クラスの代わりに親クラスにBacklinkを配置した例しかないので、これが可能かどうかは分かりません。

JSON逆シリアル化によってリレーションシップを逆にしてカテゴリを作成すると、ルームのリストは含まれませんでしたが、ルームにカテゴリが含まれるようになりました(説明されているようにバックリンクを使用できるようになります)。私が見つけた例では)。ただし、Categoryプロパティをルームに追加し、CategoryクラスのRoomsプロパティをバックリンクに変更するだけで、C#モデルを変更するだけで、カテゴリプロパティがまったく設定されていないため空の関係になりました。たぶん私は、この機能を有効にするためにJsonSerializerSettingsを変更する必要がありますが、これが可能であれば、私は情報を見つけることができませんでした。これは、使用しようとすると、最初は、このアプローチは私にエラーを与えている動作するように見えますが

public Category Category 
{ 
    get 
    { 
     return Realm.Find<Category>(CategoryId); 
    } 
} 

私の最後の試みは私のルームオブジェクトからCategoryオブジェクトを与えるために区分を使用する方法を作成することでした関係としてRealm(Linqを使用)へのクエリのRoom.Category関係はRealmで処理できません。また、アプリケーションを構築するときに警告が表示されます。Warning: Fody/RealmWeaver: Room.Category is not an automatic property but its type is a RealmObject which normally indicates a relationship.

この問題に関するお手伝いがあります。

ありがとうございます。

答えて

0

バックリンクのプロパティは、2つの異なるカテゴリに同じ部屋を追加することができないため、常にコレクションになります。そのため、ほとんどの例では「親」クラスに配置されています。

public class Room : RealmObject 
{ 
    // Other properties 

    // Notice that the collection may be private 
    // to avoid polluting your public API 
    [Backlink(nameof(Category.Rooms))] 
    private IQueryable<Category> Categories { get; } 

    // May also use FirstOrDefault if you can't guarantee 
    // the room will be added to a single Category 
    public Category Category => Categories.SingleOrDefault(); 
} 

に注意してくださいあなたはまだでCategoryを使用することはできません:あなたはそれだけで単一の親に属します特定している場合でも、あなたは簡単に「子」クラスに1を追加することができますこれはRealmが認識している永続プロパティではないためです。

関連する問題