我想用房间库改变我的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中这样做。
但现在我想要它与房间
首先,您必须为两者创建模型类,您可能已经声明了它们,如果它们已经存在,您只需要进行一些更改。
@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实现房间的基本功能