2

私はsqliteデータベースをルームライブラリで変更しようとしています。私は左の結合クエリと少し混乱しています。アンドロイドルームに参加しました

私はsqliteで実装していますが、どのように私は同じwithh部屋を達成することができますか分からないのですか?

最初のテーブル::通知

db.execSQL("CREATE TABLE IF NOT EXISTS $TABLE_NAME ($COLUMN_ID INTEGER PRIMARY KEY, $ICON TEXT, $TITLE INTEGER," + 
       " $DATE INTEGER, $TYPE INTEGER,$URL TEXT, $MESSAGE INTEGER, FOREIGN KEY($TITLE) REFERENCES ${TableNotificationsTrans.getTableName(this)}(id)," + 
       "FOREIGN KEY($MESSAGE) REFERENCES ${TableNotificationsTrans.getTableName(this)}(id))") 

第二のテーブル:私は通知を格納しています私は何をやっているNotification_Trans

db.execSQL("CREATE TABLE IF NOT EXISTS $TABLE_NAME ($COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, $COLUMN_EN TEXT, $COLUMN_GU TEXT, $COLUMN_HI TEXT)") 

ここ

は、私のテーブルの作成です 通知テーブルの名前と説明は、 notification_transに特定の言語で格納されます。

クエリを達成する

DatabaseHelper.database!!.rawQuery("SELECT A.$COLUMN_ID, A.$ICON, N.${language.toLowerCase()} $TITLE, A.$DATE, A.$TYPE, A.$URL, M.${language.toLowerCase()} $MESSAGE FROM $TABLE_NAME A LEFT JOIN NotificationsTrans N ON A.$TITLE = N.id LEFT JOIN NotificationsTrans M ON A.$MESSAGE = M.id ORDER BY $DATE DESC LIMIT $pageNum*10, 10", null) 

質問

How can I achieve same with room? 

編集

私のアプリケーションは、私は特定の言語での通知のタイトルを取得しています多言語アプリケーションであり、 、lヒンディー語やグジャラト語。 通知テーブルに通知の詳細を保存しています。タイトルはnotification_transです。

NotificationTransには、id、english、hindi、gujaratiの列があります。

ユーザーがグジャラートを求めたとき、私はnotificationTransのコラムgujaratiから通知のタイトルを取得しています。

これは、sqliteで実行できます。

しかし、今、私はあなたが両方のためのモデルクラスを作成する必要がありルーム

+1

静的クエリを使用していた場合は、Room内でSQLiteで使用したのとまったく同じものを使用します。あなたのケースでは、文字列の補間を使用してクエリを生成しています。この場合、ルームはあなたを助けません。 – CommonsWare

答えて

0

まずでそれをしたいが、あなたはすでにそれを宣言していること、あなたはちょうど彼らがすでに存在する場合、いくつかの変更を加える必要があります。

@Entity 
public class Notification { 
    @PrimaryKey 
    int id; 
    String icon; 
    @ForeignKey(entity = Notification_Trans.class, parentColumns = "col_id", childColumns = "id") 
    String title; 
    int date; 
    int type; 
    String url; 
    int msg; 

} 

    @Entity 
public class Notification_Trans { 
    @PrimaryKey(autoGenerate = true) 
    int col_id; 
    String column_en; 
    String column_gu; 
    String column_hi; 

これは、あなたが合うように変更を行うことができ、私はあなたの外部キー制約を理解し、そのため私を許しませんでした、あなたのPOJOになります。あなたはthis`

@Dao
public interface DAO { 

    @Query("SELECT note.id, note.title, note.description, category.name as categoryName " + 
      "FROM note " + 
      "LEFT JOIN category ON note.category_id = category.id") 
    List getCategoryNotes(); 

} 
` 

ごとに、あなたのDAOを宣言することができます 私はLink hereで見つけたクエリの変化を、行っていません。あなたのクエリーは複雑なものでしたが、それをどうやって行うかについてのアイデアがあります。、この後 、あなたはこの1つだけbelow`

@Database(entities = {Notification.class, NotificationTrans.class}, version = 3) 
public abstract class AppDatabase extends RoomDatabase { 

    private static AppDatabase instance; 

    public static AppDatabase getAppDatabase(Context context) { 
     if (instance == null) { 
      instance = 
        Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "database_name") 
          // allow queries on the main thread. 
          // Don't do this on a real app! See PersistenceBasicSample for an example. 
          //.allowMainThreadQueries() 
          .fallbackToDestructiveMigration() 
          .build(); 
     } 
     return instance; 
    } 

    public static void destroyInstance() { 

     instance = null; 
    } 

    public abstract Dao notificationDao(); 

ようですが、データベース用に別のクラスを作成するのに役立ちます、作成&に他のすべてのものの部屋を処理するデータベースのクラスオブジェクトから、あなたのダオ・インタフェースにアクセスする必要があります、&からオブジェクトを追跡します。 はここにあなたのDAOは

`、のようになります方法は次のとおりです。 &あなたはあなたが部屋間の関係を理解するために thisを参照するために必要な場合があり AppDatabase.getAppDatabase(context).notificationDao().yourQueryMethodName();

を使用してデータにアクセスすることができ、&はあなたの条件、

EDIT 1を実装します

@Insert 
void insert(Notifications object); 

//これは、単一の項目を挿入します

@Insert 
void insertAll(Notifications... objects); 

これは、Data、

のリストを入力することができますが、あなたがinsert() &は、それをデータベースに格納する必要があるオブジェクトを渡す呼び出す場合は、ここでAppDatabase.getAppDatabase(context).notificationDao().yourQueryMethodName()代わりのyourQueryMethod()ように、あなたのデータベースオブジェクトでこのメソッドを呼び出すことができますそれでいいよ、

たとえばdb.parcelDao().insert(parcel); これは私のParcelDaoにデータを挿入する方法です、dbはデータベースオブジェクト、&パーセルはデータのオブジェクトを格納する必要があります。もう1つは、メインスレッドでこのメソッドを呼び出すことができないため、目的のためにHandlerまたはAsyncTaskを使用する必要があるかもしれません。申し訳ありません。 ルームTraining at Android Developersルームの基本機能の実装についてはこちらをご覧ください

+0

詳細な答えを教えてください。どうすればいいですか –

+0

あなたが理解できなかったことを教えてください。&その部分を具体化しようとします –

+0

これでデータベースにどのように値を挿入できますか? –

関連する問題