Я работаю над школьным проектом, где мне нужно закодировать проект андроида в архитектурном шаблоне MVP. Я начал заниматься исследованиями в Google Dagger 2. На данный момент я просто пытаюсь проверить, существует ли пользователь в базе данных или нет. Проблема, как известно, проходит через контекст. Я искал краткий ответ, но ничего не нашел. Вот как я пытался это сделать.Android MVP + Google Dagger 2 + SQLite
код для использования Dagger 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);
}
}
Я хотел бы знать, если это правильный способ реализации MVP с помощью Google Кинжал 2. Я лично чувствую, что должен быть другой способ реализации этого; Передача контекста ведущему превосходит цель использования кинжала. Я только начал изучать образцы Google Dagger 2 и MVP. Поэтому любые предложения будут полезны. Я просто хочу, чтобы это было правильно. Не хотите потерять оценку. :)
Любые предложения и рекомендации будут полезны. :)
может показаться полезной [Почему действия в Android не являются элементами пользовательского интерфейса] (http://www.techyourchance.com/activities-android/) – tchelidze