Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android与room的左连接查询_Android_Database_Android Room_Kotlin Android Extensions - Fatal编程技术网

android与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

我正试图用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))")
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无法帮助您。