2016-12-29 78 views
1

我正在学校项目中,我必须编写一个MVP架构模式的Android项目。我也开始对Google Dagger 2进行一些研究。现在我只是试图检查一个用户是否存在于数据库中。众所周知,问题在于通过上下文。我寻找一个简洁的答案,但我找不到任何东西。我试图这样做。Android MVP +谷歌匕首2 + SQLite

代码使用匕首2方面:

public class DaggerApplication extends Application { 
    DaggerComponent daggerComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     daggerComponent = DaggerComponent.builder().daggerModule(new DaggerModule(this)).build(); 
     daggerComponent.inject(this); 
    } 

    public DaggerComponent getAppComponent(){ 
     return daggerComponent; 
    } 
} 


@Module 
public class DaggerModule { 
    private final DaggerApplication daggerApplication; 

    public DaggerModule(DaggerApplication daggerApplication){ 
     this.daggerApplication = daggerApplication; 
    } 

    @Provides 
    @Singleton 
    Context providesApplicationContext() { 
     return this.daggerApplication; 
    } 

    @Provides 
    @Singleton 
    SharedPreferences providesSharedPreferences(Context context) { 
     return context.getSharedPreferences("My_Pref", Context.MODE_PRIVATE); 
    } 
} 

@Singleton 
@Component 
     (modules = {DaggerModule.class}) 
public interface DaggerComponent { 
    void inject(DaggerApplication daggerApplication); 
    void inject(SigninActivityFragment signinActivityFragment); 
} 

然后我让我的背景在这样的片段:

@Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     ((DaggerApplication)getActivity().getApplication()).getAppComponent().inject(this); 
     accountPresenter = new AccountPresenter(this,new MyDatabaseSource(context)); 
    } 

的MyDatabaseSource需要这方面的数据库工作。然后,这个MyDatabaseSource打开数据库,从数据库中获取用户并关闭它。像这样:

public class MyDatabaseSource implements MyModel { 
    public MyDatabaseSource(@NonNull Context context) { 
     checkNotNull(context); 
     myLocalDatabaseOpenHelper = new MyLocalDatabaseOpenHelper(context); 
    } 
    //Implementing MyModel functions here 
} 

这就是为什么我需要上下文。

public class MyLocalDatabaseOpenHelper extends SQLiteOpenHelper { 

    private static final String MY_LOCAL_DATABASE_NAME = "MyUserDatabase"; 
    private static final int MY_LOCAL_DATABASE_VERSION = 1; 

    public MyLocalDatabaseOpenHelper(Context context) { 
     super(context, MY_LOCAL_DATABASE_NAME, null, MY_LOCAL_DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     //Created my database here 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Not required as at version 1 
    } 

    @Override 
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Not required as at version 1 
    } 
} 

我创建了MyDatabaseSource实现的接口,我称它为MyModel。

下面是代码:

public interface MyModel { 

    void insertUser(User user); 
    void deleteUser(int index); 
    void updateUser(User user); 
    ArrayList <User> getUsers(); 
    User getUser(int index); 

} 

然后我的演讲有它在,才能成为我的视图和模型之间的中间人所需要的一切。

这是我的主持人代码:

public AccountPresenter(AccountView accountView, MyModel myModel) { 
     this.accountView = accountView; 
     this.myModel = myModel; 
    } 

    public void onSignInButtonClicked() { 
     String username = accountView.getUsername(); 
     String password = accountView.getPassword(); 
     if (username.isEmpty()) { 
      accountView.setUsernameErrorMessage(R.string.activity_signin_username_error); 
     } 
     if (password.isEmpty()) { 
      accountView.setPasswordErrorMessage(R.string.activity_signin_password_error); 
     } 

     ArrayList<User> userArrayList = myModel.getUsers(); 
     if (userArrayList.size() != 0) { 
      for (int i = 0; i < userArrayList.size(); i++) { 
       if (username.equals(userArrayList.get(i).getUserName())) { 
        if (password.equals(userArrayList.get(i).getUserPassword())) { 
         accountView.showUserExists(R.string.activity_signin_user_exists_toast); 
        } else { 
         accountView.showIncorrectPassword(R.string.activity_signin_incorrect_password_toast); 
        } 
       } else { 
        accountView.showUserDoesNotExist(R.string.activity_signin_user_does_not_exist_toast); 
       } 
      } 
     } else { 
      accountView.showNoUserExists(R.string.activity_signin_no_exists_toast); 
     } 
    } 

我想知道这是否是使用谷歌匕首2.我个人觉得应该是实现这个另一种方式实现MVP的正确方法;将主题背景传递给主持人会胜过使用Google Dagger的目的。我刚开始研究Google Dagger 2和MVP模式。所以任何建议都会有帮助。我只是希望它是正确的。不想放松评分。 :)

任何建议和意见将有所帮助。 :)

+0

你可能会发现这篇文章很有用[为什么Android中的活动不是UI元素](http://www.techyourchance.com/activities-android/) – tchelidze

回答

1

通过上下文来演示节拍使用谷歌匕首

如果Android应用程序有一个单一入口点(如main(String [] args)方法)的目的,那么这将是可能的,希望所有注入依赖关系,包括上下文,单独使用Dagger。换句话说,你不需要在这个系统中使用Context作为参数初始化Dagger组件。如果是这种情况,那么向主持人传递上下文会以某种方式击败使用Dagger 2的目的。

但是,构成应用程序的应用程序和活动的实例无法直接实例化。尽管其中一些类可能具有公共构造函数,但您无法通过实例化来获得全功能实例。相反,这些实例化的类会被系统提供Context和其他依赖项(如FragmentManager)。

同样,将来自应用程序或活动的上下文作为存储库/数据或模型的依赖关系,并不是一种可预防的违反模型和视图之间的关注的分离。

我想知道这是否是使用谷歌匕首2

对于本实施MVP的正确方式,我认为你将有比较您与其他样本MVP项目做了什么。这里是official one from Google

此外,你将不得不决定,如果你真的应验的MVP三个显着特点:

  1. 该模型显示或以其他方式采取行动定义数据接口在用户界面中。
  2. 演示者对模型和视图起作用。它从存储库(模型)中检索数据,并将其格式化以便在视图中显示。
  3. 该视图是一个被动接口,它显示数据(模型)并将用户命令(事件)路由到演示者以对该数据执行操作。

而不是担心你是否有MVP“正确的解决方案”在Android中,我觉得最重要的是你自己能够理解并证明你的应用程序是如何满足MVP的标准并在Android架构的约束范围内实现关注点分离。