2016-12-29 5 views
1

Я работаю над школьным проектом, где мне нужно закодировать проект андроида в архитектурном шаблоне 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. Поэтому любые предложения будут полезны. Я просто хочу, чтобы это было правильно. Не хотите потерять оценку. :)

Любые предложения и рекомендации будут полезны. :)

+0

может показаться полезной [Почему действия в Android не являются элементами пользовательского интерфейса] (http://www.techyourchance.com/activities-android/) – tchelidze

ответ

1

проходя контекст ведущий бьет цель с помощью Google Dagger

Если программы имели единую точку входа (например, метод main(String [] args)), то можно было бы и желательно вводить все зависимых, включая контекст, используя только кинжал. Другими словами, вам не нужно иметь эту систему, где компонент кинжала инициализируется с помощью контекста в качестве параметра. Если это так, то передача Контекста ведущему будет каким-то образом превзойти цель использования Dagger 2.

Однако экземпляры приложения и активности, составляющие приложение, не могут быть созданы напрямую. Хотя некоторые из этих классов могут иметь общедоступные конструкторы, вы не можете получить полнофункциональный экземпляр через экземпляр. Вместо этого эти экземпляры создаются с помощью Контекста и других зависимостей (таких как FragmentManager) системой.

Аналогичным образом, наличие Контекста из Приложения или Действия в качестве зависимости для репозитория/данных или модели не является предотвратимым разделом проблем между моделью и представлением.

Я хотел бы знать, если это правильный способ реализации MVP с помощью Google Dagger 2

Для этого я думаю, вы должны сравнить то, что вы сделали с другими проектами образца MVP. Вот official one from Google

Кроме того, вы должны решить, если вы действительно выполнили три характерные черты MVP:

  1. является интерфейсом определения данных, которые будут отображаться модели или иным образом действовали на в пользовательском интерфейсе.
  2. Ведущий действует на модель и вид. Он извлекает данные из репозиториев (модели) и форматирует их для отображения в представлении.
  3. Вид представляет собой пассивный интерфейс, который отображает данные (модель) и направляет пользовательские команды (события) ведущему, чтобы воздействовать на эти данные.

Вместо того, чтобы беспокоиться о том, есть ли у вас «правильное решение» для MVP в Android, я думаю, что самое главное, чтобы вы сами, чтобы быть в состоянии понять и оправдать, как ваше приложение соответствует критериям MVP и обеспечивает разделение проблем в рамках ограничений архитектуры Android.

 Смежные вопросы

  • Нет связанных вопросов^_^