2017-12-18 96 views
2

我正在尝试更改我的sqlite数据库与房间库。我有点困惑与左连接查询。android左连接与房间查询

我已经用sqlite实现了它,但不知道如何才能达到同样的房间?

这里是我创建表:

第一个表:通知

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 ike印地文或古吉拉特语。我在通知表中存储通知详细信息,同时标题notification_trans

NotificationTrans有id,英文,印地文,古吉拉特语的专栏。

当用户询问古吉拉特语时,我正在从notificationTrans的列gujarati中重新获取通知标题。

我可以这样做,在sqlite中。

但现在我想它

+1

如果您有静态查询,您可以在Room中使用它,就像您在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,我不明白你的外键约束,所以原谅我说,你认为合适,你可以进行更改。 你可以宣布你的DAO按查询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(); 

} 
` 

我还没有做出改变,我发现在Link here。由于你的查询是一个复杂的问题,但它会给你一个关于如何做到这一点的想法。, 在此之后,你只需要从数据库类对象来访问你的DAO接口,它将处理创造&所有其他东西的房间,像这样的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(); 

它有助于创建数据库单独的类,&跟踪它的对象。 &你可以用AppDatabase.getAppDatabase(context).notificationDao().yourQueryMethodName();

访问您的数据,您可能需要参考this理解房间之间的关系,&实现您的要求,

编辑1: 这是你的DAO应该怎么样子,`

@Insert 
void insert(Notifications object); 

//这将插入一个项目

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

虽然这可以输入数据的列表,

你可以在这里调用此方法与数据库对象,像AppDatabase.getAppDatabase(context).notificationDao().yourQueryMethodName()代替yourQueryMethod(),如果调用insert() &传给你需要在数据库中存储的对象,它会这样做,

For Eg db.parcelDao().insert(parcel); 这是我如何在我的ParcelDao中插入Data,db是Database对象,& parcel是需要存储数据的对象。还有一件事,你不能在主线程中调用这个方法,所以你可能需要使用Handler或者AsyncTask来实现这个目的,对不起,我忘了提及这个。 查看房间Training at Android Developers实现房间的基本功能

+0

请给出详细的答案..我如何插入 –

+0

让我知道你不明白,我会尽力详述那部分 –

+0

如何在数据库中插入值? –