android左连接与房间查询
我正在尝试更改我的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中。
但现在我想它
房回答:
首先你必须做模型类两种,您可能已经宣告他们,你只需要进行一些更改,如果他们已经存在。
@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实现房间的基本功能
以上是 android左连接与房间查询 的全部内容, 来源链接: utcz.com/qa/261245.html