Android MVP +谷歌匕首2 + SQLite
我正在学校项目中,我必须编写一个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模式。所以任何建议都会有帮助。我只是希望它是正确的。不想放松评分。 :)
任何建议和意见将有所帮助。 :)
通过上下文来演示节拍使用谷歌匕首
如果Android应用程序有一个单一入口点(如main(String [] args)
方法)的目的,那么这将是可能的,希望所有注入依赖关系,包括上下文,单独使用Dagger。换句话说,你不需要在这个系统中使用Context作为参数初始化Dagger组件。如果是这种情况,那么向主持人传递上下文会以某种方式击败使用Dagger 2的目的。
但是,构成应用程序的应用程序和活动的实例无法直接实例化。尽管其中一些类可能具有公共构造函数,但您无法通过实例化来获得全功能实例。相反,这些实例化的类会被系统提供Context和其他依赖项(如FragmentManager)。
同样,将来自应用程序或活动的上下文作为存储库/数据或模型的依赖关系,并不是一种可预防的违反模型和视图之间的关注的分离。
我想知道这是否是使用谷歌匕首2
对于本实施MVP的正确方式,我认为你将有比较您与其他样本MVP项目做了什么。这里是official one from Google
此外,你将不得不决定,如果你真的应验的MVP三个显着特点:
- 该模型显示或以其他方式采取行动定义数据接口在用户界面中。
- 演示者对模型和视图起作用。它从存储库(模型)中检索数据,并将其格式化以便在视图中显示。
- 该视图是一个被动接口,它显示数据(模型)并将用户命令(事件)路由到演示者以对该数据执行操作。
而不是担心你是否有MVP“正确的解决方案”在Android中,我觉得最重要的是你自己能够理解并证明你的应用程序是如何满足MVP的标准并在Android架构的约束范围内实现关注点分离。
你可能会发现这篇文章很有用[为什么Android中的活动不是UI元素](http://www.techyourchance.com/activities-android/) – tchelidze