2017-01-22 3 views
1

私はRealmを使用してAndroidで実装する予定のデータベースを設計しています。私はまだライブラリを使用していることについて調べて読んでいますが、私には1つの質問があります。レルムを使用してブリッジテーブル(下図参照)を実装することは可能ですか?私がドキュメントlinkの "Relationships"セクションで読んだところから、私はRealmListオブジェクトを使用して多対多の関係を行うことができます。たとえば、 "User_Activity"テーブルの場合。しかし、私は、データベース設計を同等のRealmクラスに「変換する」方法はまだ不明です。どんなアドバイスも高く評価されます!ブリッジテーブル相当のレルムクラスを作成していますか?

enter image description here

+1

ユーザーがに属することができます複数の活動?アクティビティは複数のユーザーに属しますか? – EpicPandaForce

+0

@EpicPandaForceアクティビティ(Static、Running、Walkingなど)は、複数のユーザーに属することができます。これは私の頭の中でそれを見たものです。アクティビティテーブルには、Walking、Running、Cyclking、Staticの4つのエントリしか格納されず、UserActivityで参照され、異なるユーザに関連付けられます。 –

+1

ああ、これまでの過去のユーザー活動を日付別に記録することもできます。 – EpicPandaForce

答えて

1
public class User extends RealmObject { 
    @PrimaryKey 
    private String userId; 

    private String password; 

    @Index 
    private String username; 

    private String paGoal; // ? 

    private long maxInactivityInterval; 

    private RealmList<UserActivity> userActivities; 

    private Activity currentActivity; // optional 
} 

public class UserActivity extends RealmObject { 
    @PrimaryKey 
    private String userIdAndActivityIdAndDate; // userid_activityid_2017-01-23 

    @Index 
    private Date date; 

    private long duration; 

    private User user; 

    @Index 
    private String userId; 

    private Activity activity; 

    @Index 
    private String activityId; 
} 

public class Activity extends RealmObject { 
    @PrimaryKey 
    private String activityId; 

    @Index 
    private String type; 
} 

としてリンクされたオブジェクトを定義します。

+0

あなたの答えをありがとう。非常に良い見えます。しかし、1つの質問。正しいということです> 112017-01-23 - 私はのActivityIDは= 1、キーがそのように見ていることになるとはuserId = 1と活性を持つユーザーを持っている場合、フィールド「userIdAndActivityIdAndDate」としては、例えば「compaundキー」になりますか? –

+1

@GeorgiKoemdzhiev yup、私は '_'sで分けるのが好きです。)また、主キーに時分が必要な場合にも、それはあなたがそこで想像しておくべきものなので、' 2017-01-23-18 -00-00'程度です。 – EpicPandaForce

+1

ご協力いただきありがとうございます!とても有難い! :) –

1

のようにあなたは、単にあなたのクラスを定義することができます:あなたはあなたのモデルに "外国ID" を格納する必要はありません

public class User { 
    private int id; 
    private String username; 
    ... 
    private UserActivity userActivity; 
} 

public class UserActivity { 
    private int id; 
    private Activity activity; 
} 

。 Realmは実際に関連するリンクされたオブジェクトをポインタの下に格納しています。だからレルムのリンクdocをたどると、私はこのスキーマがあなたのために正常に動作すると思いフィールド

+0

ありがとうございました。私は混乱していると思うのは、典型的なデータベースの知識を使ってデータベースを設計しようとしていて、Realmが典型的なクラスのように非常にオブジェクト指向であることを忘れていたことです。 –

+0

私の主な関心事特定のユーザーを特定のアクティビティにどのように関連付けることができるか。 UserクラスにRealmList フィールドを作成すると、そのトリックが行われると思いますか? –

+1

はい、 'RealmList 'はうまくいくでしょう。 – beeender

1

User_Activityテーブルは、データベース内の二次の表です。セカンダリテーブルは、多対多の関係を持つ2つの異なるテーブルの関連レコードをバインドするのに役立ちます。だから、私はRealmでUserActivityクラスを定義する理由はありません。

public class User { 
    private RealmList<Activity> activities; 
} 

public class Activity { 
    private RealmList<Users> users; 
} 

多対多の関係が必要な場合は、十分である必要があります。

しかし、あなたの質問のように、私はあなたが1対多の関係が必要と考えている、だからenter image description here

のように、正しい定義は次のようになります。

public class User { 
    private RealmList<Activity> activities; 
} 

public class Activity { 
    private user = User; 
} 
+1

リンクオブジェクトはrealm-javaではまだサポートされていません。https:// github。 – EpicPandaForce

+0

2つのテーブルを持つユーザー - userIdを持つユーザー(および上記の他のフィールドとRealmListのアクティビティ)とActivityテーブル"type"、 "date"、 "duration"フィールド(ユーザーのIDでアクティビティを取得しようとしているのでIDなし)を指定します。 –

+0

ありがとうございます。思考、それは迅速だった:) –

関連する問題