如何从 Presenter (MVP) 初始化 Room 数据库
How can i initialize Room database from Presenter (MVP)
我正在尝试在我的项目中实施 Room 数据库,但我遇到了问题。
我正在使用 MVC 模式,在演示者中,我想初始化房间数据库。但是要做到这一点,我需要一个演示者不应该有的上下文。我做错了什么?
我的房间数据库:
@Database(entities = {SportEvent.class},version = 1)
public abstract class RecommendedEventsDB extends RoomDatabase {
private static RecommendedEventsDB INSTANCE;
public abstract SportEventDao sportEventDao();
//singleton instance of database
public static RecommendedEventsDB getRecommendedEventsDB(Context context){
if(INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RecommendedEventsDB.class, "recommended_Events")
.allowMainThreadQueries() //need to be deleted, for testing purpose only!!!
.build();
}
return INSTANCE;
}
}
我想在 Presenter 中启动数据库:
RecommendedEventsDB db = RecommendedEventsDB.getRecommendedEventsDB(context);
但我没有上下文...
你能帮帮我吗?
有一个 talk 大约 Fragment
秒(Google I/O 2016)据此
Fragments are part of the ? in MV?
(大约 9:30 分钟)并且 Fragment
确实有一个 Context
只要它们附加到 Activity
.
一个有趣的观点。
但如果坚持要有一个 Android
-free Presenter,那么可以使用 interface
(或两个):
Presenter 需要一个 interface
- 我们称之为 ViewInterface
- 与它所属的 Fragment
或 Activity
或 View
进行通信。没有这个 ViewInterface
,"real world" 就不会发生任何事情。
数据库(作为物理存储数据和访问存储数据的一种方式)是这个 "real world" 的重要组成部分,因此 Presenter 要求其 ViewInterface
让某人或者实例化数据存储设施,请返回另一个 interface
以便 Presenter 可以导致所有 CRUD 操作发生。我们称这个为 DatabaseInterface
.
所以基本上,您有两个 interface
。第一个可以通过 Fragment
或 View
实现
interface ViewInterface{
// ...
DatabaseInterface getDatabaseInterface();
}
第二个可以由另一个 class 实现,后者将管理数据库操作
interface DatabaseInterface{
void insertNewCustomer(Customer customer);
void deleteCustomer(long customerDbId);
List<Customer> findAllCustomers();
// ...
}
我正在尝试在我的项目中实施 Room 数据库,但我遇到了问题。 我正在使用 MVC 模式,在演示者中,我想初始化房间数据库。但是要做到这一点,我需要一个演示者不应该有的上下文。我做错了什么?
我的房间数据库:
@Database(entities = {SportEvent.class},version = 1)
public abstract class RecommendedEventsDB extends RoomDatabase {
private static RecommendedEventsDB INSTANCE;
public abstract SportEventDao sportEventDao();
//singleton instance of database
public static RecommendedEventsDB getRecommendedEventsDB(Context context){
if(INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RecommendedEventsDB.class, "recommended_Events")
.allowMainThreadQueries() //need to be deleted, for testing purpose only!!!
.build();
}
return INSTANCE;
}
}
我想在 Presenter 中启动数据库:
RecommendedEventsDB db = RecommendedEventsDB.getRecommendedEventsDB(context);
但我没有上下文...
你能帮帮我吗?
有一个 talk 大约 Fragment
秒(Google I/O 2016)据此
Fragments are part of the ? in MV?
(大约 9:30 分钟)并且 Fragment
确实有一个 Context
只要它们附加到 Activity
.
一个有趣的观点。
但如果坚持要有一个 Android
-free Presenter,那么可以使用 interface
(或两个):
Presenter 需要一个 interface
- 我们称之为 ViewInterface
- 与它所属的 Fragment
或 Activity
或 View
进行通信。没有这个 ViewInterface
,"real world" 就不会发生任何事情。
数据库(作为物理存储数据和访问存储数据的一种方式)是这个 "real world" 的重要组成部分,因此 Presenter 要求其 ViewInterface
让某人或者实例化数据存储设施,请返回另一个 interface
以便 Presenter 可以导致所有 CRUD 操作发生。我们称这个为 DatabaseInterface
.
所以基本上,您有两个 interface
。第一个可以通过 Fragment
或 View
interface ViewInterface{
// ...
DatabaseInterface getDatabaseInterface();
}
第二个可以由另一个 class 实现,后者将管理数据库操作
interface DatabaseInterface{
void insertNewCustomer(Customer customer);
void deleteCustomer(long customerDbId);
List<Customer> findAllCustomers();
// ...
}