android与room的左连接查询
我正试图用room library更改我的sqlite数据库。我有点搞不懂左连接查询 我已经用sqlite实现了它,但不知道如何用H room实现它 以下是我的表格创建: 第一个表格:通知android与room的左连接查询,android,database,android-room,kotlin-android-extensions,Android,Database,Android Room,Kotlin Android Extensions,我正试图用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 I
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))")
How can I achieve same with room?
第二个表格:通知_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)")
我所做的是将通知存储在通知表中,但其名称和描述将使用特定语言存储在通知_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)
问题
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))")
How can I achieve same with room?
编辑
我的应用程序是多语言应用程序,在这里,我将获得具有特定语言的通知标题,如印地语或古吉拉特语。我将通知详细信息存储在通知表中,而标题存储在通知中
NotificationTrans有id、英语、印地语、古吉拉特语列
当用户询问古吉拉特语时,我正在从notificationTrans的古吉拉特语专栏中检索通知标题
我可以在sqlite中这样做
但是现在我想在Room中使用它,首先您必须为这两个类创建模型类,您可能已经声明了它们,如果它们已经存在,您只需要做一些更改
@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`
@刀
我没有在查询中进行更改,我在中找到了。因为您的查询很复杂,但是,它会让您了解如何进行查询。,
在这之后,您只需要从数据库类对象访问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()访问数据代码>
您可能需要参考以了解房间之间的关系,并实施您的要求
编辑1:
你的刀应该是这样的`
@Insert
void insert(Notifications object);
//这将插入单个项目
@Insert
void insertAll(Notifications... objects);
虽然这可以输入数据列表
您可以使用数据库对象调用此方法,如AppDatabase.getAppDatabase(context).notificationDao().yourQueryMethodName()
,而不是yourQueryMethod()
,如果您调用insert()
&传递需要存储在数据库中的对象,它就会这样做
例如,db.parcelDao()。插入(地块)代码>
这就是我在ParcelDao中插入数据的方式,db是数据库对象,&parcel是需要存储的数据对象。还有一件事,您不能在主线程上调用此方法,因此您可能需要使用Handler或AsyncTask来实现此目的,很抱歉,我忘了提到这一点。
查看Room以实现Room 1的基本功能-需要创建一个与查询结果匹配的模型类
data class ClientAndCity(
@ColumnInfo(name="id") val id: Long,
@ColumnInfo(name="client_name") val clientName: String?,
@ColumnInfo(name="city_name") val cityName: String?
)
#2-在DAO内部创建查询
@Query("SELECT clients.id, clients.name AS client_name, cities.name AS city_name FROM clients LEFT JOIN cities ON cities.id = clients.city_id WHERE clientes.id = :clientId")
fun getClientAndHisCity(clientId: Long): ClientAndCity?
#3使用您的功能
CoroutineScope(Dispatchers.IO).launch{
val result: ClientAndCity = clientDAO.getClientAndHisCity(clientId)
//do something with it
}
请给出详细的答复。。如何插入让我知道您不理解的内容,我将尝试详细说明这一部分,如何在数据库中插入值?这不会在trans table中插入。您可以为trans table创建类似的方法,您只需要为该类创建一个类似的Dao,请参阅更多,如果您有静态查询,您将在房间中使用它,与在SQLite中使用它完全相同。在您的例子中,您使用字符串插值来生成查询,在这种情况下,Room无法帮助您。