2017-12-18 26 views
2

방 라이브러리로 내 sqlite 데이터베이스를 변경하려고합니다. 나는 왼쪽 join 쿼리와 혼동하지 않는다.android left with join room

나는 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가 영어, 힌디어, 구자라트 인 열이 있습니다.

사용자가 구자라트를 요청하면 notificationTrans의 구자라트 어로 알림 제목을 검색하고 있습니다.

나는 sqlite에서 그렇게 할 수있다.

그러나 지금 나는 방

+1

정적 쿼리를 사용하는 경우 SQLite에서 사용하는 것과 똑같은 Room에서 사용합니다. 귀하의 경우, 문자열 보간법을 사용하여 쿼리를 생성합니다.이 경우 방에서 도움을받을 수 없습니다. – 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 있도록합니다. 당신은 내가 Link here에서 발견 된 쿼리에 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를 선언 할 수 있습니다. 귀하의 질의가 복잡한 것처럼, 그러나, 당신에게 그것을 할 수있는 방법에 대한 아이디어를 줄 것입니다., 이 후, 당신은

@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(); 

그것은 데이터베이스에 대해 별도의 클래스를 생성하는 데 도움이 below` 이것처럼, 창조 & 다른 모든 것들을 룸을 처리하는, 데이터베이스 클래스 개체에서 다오 인터페이스에 액세스 할 필요가 , &에서 객체를 추적합니다. 여기 당신의 DAO가

`처럼 보여야하는 방법은 다음과 같습니다 & 당신은 당신은 방 사이의 관계를 이해하는 this을 참조해야 할 수도 있습니다 AppDatabase.getAppDatabase(context).notificationDao().yourQueryMethodName();

하여 데이터에 액세스 할 수 & 귀하의 요구 사항,

EDIT (1)를 구현

@Insert 
void insert(Notifications object); 

//이 단일 항목을 삽입합니다

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

이 데이터의 목록을 입력 할 수 있지만, 당신은 insert() &가 데이터베이스에 저장해야 할 개체를 전달 호출하는 경우

당신은, 대신 yourQueryMethod()의 여기 AppDatabase.getAppDatabase(context).notificationDao().yourQueryMethodName()처럼 데이터베이스 개체로이 메서드를 호출 할 수 있습니다 할게,

예를 들면 db.parcelDao().insert(parcel); 이것은 내 ParcelDao에 데이터를 삽입하는 방법입니다. db는 데이터베이스 개체입니다. & 소포는 저장할 데이터의 개체입니다. 한 가지 더, 당신은 메인 스레드에서이 메소드를 호출 할 수 없으므로, 목적을 위해 Handler 나 AsyncTask를 사용해야 할 수도 있습니다. 미안합니다. 방의 기본 기능 구현을 위해 방 Training at Android Developers을 살펴보십시오.

+0

자세한 답변을주십시오 ... 어떻게 삽입 할 수 있습니까? –

+0

당신이 이해하지 못했던 것을 알려주세요 & 그 부분을 자세히 설명하려고합니다 –

+0

어떻게 그걸로 데이터베이스에 값을 삽입 할 수 있습니까? –