android左连接查询与房间

问题描述 投票:3回答:1

我想用房间库改变我的sqlite数据库。我很少与左连接查询混淆。

我用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?

编辑

我的应用程序是多语言应用程序,我将获得特定语言的通知标题,如印地语或古吉拉特语。我在通知表中存储通知详细信息,而在notification_trans中存储标题。

NotificationTrans包含id,english,hindi,gujarati的列。

当用户要求古吉拉特语时,我正在从notificationTrans的古吉拉特语专栏中删除通知标题。

我能够在sqlite中这样做。

但现在我想要它与房间

android database android-room kotlin-android-extensions
1个回答
1
投票

首先,您必须为两者创建模型类,您可能已经声明了它们,如果它们已经存在,您只需要进行一些更改。

   @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

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:这是你的DAO应该是什么样子,`

@Insert
void insert(Notifications object);

//这将插入一个Item

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

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

您可以使用数据库对象调用此方法,例如AppDatabase.getAppDatabase(context).notificationDao().yourQueryMethodName()而不是yourQueryMethod(),如果调用insert()并传递需要存储在数据库中的对象,它会执行此操作,

对于E.g.db.parcelDao().insert(parcel);,这是我在ParcelDao中插入数据的方式,db是数据库对象,&parcel是需要存储数据的对象。还有一件事,你不能在主线程上调用这个方法,所以你可能需要使用Handler或AsyncTask这个目的,对不起我忘了提到它。看看Room Training at Android Developers实现房间的基本功能

© www.soinside.com 2019 - 2024. All rights reserved.