我正试图用room library更改我的sqlite数据库。我对左连接查询有点困惑。
我已经用sqlite实现了它,但是不知道如何在h room中实现同样的功能?
下面是我的表格创建:
第一个表:通知
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))")
第二个表:通知传输
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)")
我所做的是将通知存储在通知表中,但是它的名称和描述将以特定的语言存储在通知传输中。
要实现的查询
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?
编辑
我的应用程序是多语言应用程序,在这里我得到特定语言的通知标题,如印地语或古吉拉特语。我将通知详细信息存储在通知表中,而标题存储在通知事务中。
notificationtrans有id、english、hindi、gujarati的列。
当用户要求古吉拉特语时,我正在从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,我无法理解您的外键约束,所以请原谅我,您可以根据需要进行更改。
你可以根据这个申报你的刀`
@达奥
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接口,该对象将处理创建和所有其他事情,如下所示`
@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:
你的刀应该是这样的`
@Insert
void insert(Notifications object);
//这将插入单个项
@Insert
void insertAll(Notifications... objects);
虽然这可以输入数据列表,
你可以用数据库对象来调用这个方法,比如这里的
AppDatabase.getAppDatabase(context).notificationDao().yourQueryMethodName()
而不是yourQueryMethod()
,如果你调用insert()
,并传递你需要存储在数据库中的对象,它就会这样做,例如
db.parcelDao().insert(parcel);
这就是我如何在parceldao中插入数据,db是数据库对象,而parcel是需要存储的数据对象。还有一件事,您不能在主线程上调用此方法,因此您可能需要为此目的使用handler或asynctask,很抱歉我忘了提到这一点。
查看roomTraining at Android Developers以实现room的基本功能
关于android - android离开房间的联接查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47863265/