如何从Presenter(MVP)初始化Room数据库

时间:2018-01-17 18:19:08

标签: java android mvp android-room

我正在尝试在我的项目中实现Room数据库,但我遇到了问题。 我正在使用MVC模式,在演示者中,我想初始化房间数据库。但要做到这一点,我需要一个上下文,主持人不应该有。我做错了什么?

我的房间DB:

@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);

但我没有上下文......

你能帮我吗?

1 个答案:

答案 0 :(得分:-1)

talkFragment s(Google I / O 2016),据此

  

片段是?的一部分?在MV?

(大约9:30分钟)Fragment只要附加到ContextActivity就会有Android

一个有趣的观点。

但是如果有人坚持要有interface免费的演示者,那么可以使用interface(或两个):

演示者需要ViewInterface - 让我们称之为Fragment - 与其所属的ActivityViewViewInterface进行通信。没有这个ViewInterface,“真实世界”就不会发生任何事情。

数据库(作为物理存储数据和访问存储数据的一种方式)是这个“现实世界”的重要组成部分,因此Presenter要求其interface使某人或某事实例化是恰当的。数据存储设施,请返回另一个DatabaseInterface,以便Presenter可以导致所有CRUD操作发生。我们称之为interface

基本上,你有两个Fragment。第一个可以通过Viewinterface ViewInterface{ // ... DatabaseInterface getDatabaseInterface(); }

实施
interface DatabaseInterface{
    void insertNewCustomer(Customer customer);
    void deleteCustomer(long customerDbId);
    List<Customer> findAllCustomers();
    // ...

}

第二个可以由另一个类实现,然后该类将管理数据库操作

class UserProfile(AbstractBaseUser):
    is_verified = models.BooleanField(default=True)
    current_profile = models.ImageField(default=static('img/default_profile.jpg'))
    ratings = models.ManyToManyField(Video, through='UserProfileVideoRating', related_name='ratings')
    views = models.ManyToManyField(Video, through='UserProfileVideoView', related_name='views')
    CommentRating = models.ManyToManyField(Comment, through='UserProfileCommentRating', related_name='CommentRating')
    subscriptions = models.ManyToManyField(User)