Android, Do I use ViewModel to perform insertion or update?











up vote
1
down vote

favorite












I understand that ViewModel in the Architecture component is for storage and managing data so it will not be lost during config changes.



For example, my activity has nothing do with LiveData or using storage Data. Should I still go through ViewModel? or directly instantiate the Repo Class and call the insertion method? I hope that make sense



An Example of my usage of ViewModel



public class MainViewModel extends AndroidViewModel {
private DataRepo dataRepo;
private LiveData<List<Group>> groupList;
private LiveData<List<Bill>> billList;

public MainViewModel(Application application) {
super(application);
dataRepo = new DataRepo(this.getApplication));
groupList = dataRepo.getGroup();
billList = dataRepo.getBill();
}

public LiveData<List<Group>> getGroupList() {
return groupList:
}

public LiveData<List<Bill>> getBillList() {
return billList:
}

public void insertGroupAndMember(Group group) {
dataRepo.insertGroupAndMember(group);
}

public void insertBills(List<Bill> bills) {
dataRepo.insertBills(bills);
}

public List<Member> getMemberList(Group group) {
return dataRepo.getMembers(group);
}
}









share|improve this question




























    up vote
    1
    down vote

    favorite












    I understand that ViewModel in the Architecture component is for storage and managing data so it will not be lost during config changes.



    For example, my activity has nothing do with LiveData or using storage Data. Should I still go through ViewModel? or directly instantiate the Repo Class and call the insertion method? I hope that make sense



    An Example of my usage of ViewModel



    public class MainViewModel extends AndroidViewModel {
    private DataRepo dataRepo;
    private LiveData<List<Group>> groupList;
    private LiveData<List<Bill>> billList;

    public MainViewModel(Application application) {
    super(application);
    dataRepo = new DataRepo(this.getApplication));
    groupList = dataRepo.getGroup();
    billList = dataRepo.getBill();
    }

    public LiveData<List<Group>> getGroupList() {
    return groupList:
    }

    public LiveData<List<Bill>> getBillList() {
    return billList:
    }

    public void insertGroupAndMember(Group group) {
    dataRepo.insertGroupAndMember(group);
    }

    public void insertBills(List<Bill> bills) {
    dataRepo.insertBills(bills);
    }

    public List<Member> getMemberList(Group group) {
    return dataRepo.getMembers(group);
    }
    }









    share|improve this question


























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I understand that ViewModel in the Architecture component is for storage and managing data so it will not be lost during config changes.



      For example, my activity has nothing do with LiveData or using storage Data. Should I still go through ViewModel? or directly instantiate the Repo Class and call the insertion method? I hope that make sense



      An Example of my usage of ViewModel



      public class MainViewModel extends AndroidViewModel {
      private DataRepo dataRepo;
      private LiveData<List<Group>> groupList;
      private LiveData<List<Bill>> billList;

      public MainViewModel(Application application) {
      super(application);
      dataRepo = new DataRepo(this.getApplication));
      groupList = dataRepo.getGroup();
      billList = dataRepo.getBill();
      }

      public LiveData<List<Group>> getGroupList() {
      return groupList:
      }

      public LiveData<List<Bill>> getBillList() {
      return billList:
      }

      public void insertGroupAndMember(Group group) {
      dataRepo.insertGroupAndMember(group);
      }

      public void insertBills(List<Bill> bills) {
      dataRepo.insertBills(bills);
      }

      public List<Member> getMemberList(Group group) {
      return dataRepo.getMembers(group);
      }
      }









      share|improve this question















      I understand that ViewModel in the Architecture component is for storage and managing data so it will not be lost during config changes.



      For example, my activity has nothing do with LiveData or using storage Data. Should I still go through ViewModel? or directly instantiate the Repo Class and call the insertion method? I hope that make sense



      An Example of my usage of ViewModel



      public class MainViewModel extends AndroidViewModel {
      private DataRepo dataRepo;
      private LiveData<List<Group>> groupList;
      private LiveData<List<Bill>> billList;

      public MainViewModel(Application application) {
      super(application);
      dataRepo = new DataRepo(this.getApplication));
      groupList = dataRepo.getGroup();
      billList = dataRepo.getBill();
      }

      public LiveData<List<Group>> getGroupList() {
      return groupList:
      }

      public LiveData<List<Bill>> getBillList() {
      return billList:
      }

      public void insertGroupAndMember(Group group) {
      dataRepo.insertGroupAndMember(group);
      }

      public void insertBills(List<Bill> bills) {
      dataRepo.insertBills(bills);
      }

      public List<Member> getMemberList(Group group) {
      return dataRepo.getMembers(group);
      }
      }






      android mvvm architecture






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 2 days ago









      Andrey Ilyunin

      614217




      614217










      asked 2 days ago









      Rex Yu

      164




      164
























          2 Answers
          2






          active

          oldest

          votes

















          up vote
          1
          down vote













          I think you want to use a ViewModel to keep your UI controller as clean as possible. Your viewmodel should call the repo to do simple CRUD operations.
          See below snippet from documentation:




          Requiring UI controllers
          to also be responsible for loading data from a database or network
          adds bloat to the class. Assigning excessive responsibility to UI
          controllers can result in a single class that tries to handle all of
          an app's work by itself, instead of delegating work to other classes.
          Assigning excessive responsibility to the UI controllers in this way
          also makes testing a lot harder.







          share|improve this answer




























            up vote
            1
            down vote













            Here are some points I would advice you to consider:




            • MVVM as a pattern has it's roots back in 2000-th, for example, here is Martin Fowler's article about the concept, and in 2005 John Gossman announced the pattern in his blog. Yes, it solves the problem with rotation in android's implementation of the pattern, but this problem could be solved without it. MVVM is actualy needen for separation of presentation state from views that are seen to the end user. As Wiki says -



            The view model is an abstraction of the view exposing public properties and commands. Instead of the controller of the MVC pattern, or the presenter of the MVP pattern, MVVM has a binder, which automates communication between the view and its bound properties in the view model. The view model has been described as a state of the data in the model.




            So, primarily it is (like all other GUI architectural patterns in their root) about abstraction between view and domain parts of the application, so that they can vary independently and subsequent changes to the system will be cheap.




            • Instantiating domain objects in the view scope and their subsequent use by the view leads to tight coupling between the view and domain objects, which is a bad characteristic of any system. Also, it is one more reason to change view's internals, because if construction logic of the domain object changes - view will have to be changed too.


            If ViewModel is exessive for you (as I can see, its benefits are not relevant for you in this particular case, because the UI is not very complex and it's state is lightweight), consider using a less heavy-weight abstraction, such as MVP. Thus, you will be able to preserve abstraction between view and model in your application (no unwanted coupling) and you won't have to support the code that you don't benefit from.






            share|improve this answer























              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














               

              draft saved


              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53402430%2fandroid-do-i-use-viewmodel-to-perform-insertion-or-update%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes








              up vote
              1
              down vote













              I think you want to use a ViewModel to keep your UI controller as clean as possible. Your viewmodel should call the repo to do simple CRUD operations.
              See below snippet from documentation:




              Requiring UI controllers
              to also be responsible for loading data from a database or network
              adds bloat to the class. Assigning excessive responsibility to UI
              controllers can result in a single class that tries to handle all of
              an app's work by itself, instead of delegating work to other classes.
              Assigning excessive responsibility to the UI controllers in this way
              also makes testing a lot harder.







              share|improve this answer

























                up vote
                1
                down vote













                I think you want to use a ViewModel to keep your UI controller as clean as possible. Your viewmodel should call the repo to do simple CRUD operations.
                See below snippet from documentation:




                Requiring UI controllers
                to also be responsible for loading data from a database or network
                adds bloat to the class. Assigning excessive responsibility to UI
                controllers can result in a single class that tries to handle all of
                an app's work by itself, instead of delegating work to other classes.
                Assigning excessive responsibility to the UI controllers in this way
                also makes testing a lot harder.







                share|improve this answer























                  up vote
                  1
                  down vote










                  up vote
                  1
                  down vote









                  I think you want to use a ViewModel to keep your UI controller as clean as possible. Your viewmodel should call the repo to do simple CRUD operations.
                  See below snippet from documentation:




                  Requiring UI controllers
                  to also be responsible for loading data from a database or network
                  adds bloat to the class. Assigning excessive responsibility to UI
                  controllers can result in a single class that tries to handle all of
                  an app's work by itself, instead of delegating work to other classes.
                  Assigning excessive responsibility to the UI controllers in this way
                  also makes testing a lot harder.







                  share|improve this answer












                  I think you want to use a ViewModel to keep your UI controller as clean as possible. Your viewmodel should call the repo to do simple CRUD operations.
                  See below snippet from documentation:




                  Requiring UI controllers
                  to also be responsible for loading data from a database or network
                  adds bloat to the class. Assigning excessive responsibility to UI
                  controllers can result in a single class that tries to handle all of
                  an app's work by itself, instead of delegating work to other classes.
                  Assigning excessive responsibility to the UI controllers in this way
                  also makes testing a lot harder.








                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 2 days ago









                  alfalfa

                  716




                  716
























                      up vote
                      1
                      down vote













                      Here are some points I would advice you to consider:




                      • MVVM as a pattern has it's roots back in 2000-th, for example, here is Martin Fowler's article about the concept, and in 2005 John Gossman announced the pattern in his blog. Yes, it solves the problem with rotation in android's implementation of the pattern, but this problem could be solved without it. MVVM is actualy needen for separation of presentation state from views that are seen to the end user. As Wiki says -



                      The view model is an abstraction of the view exposing public properties and commands. Instead of the controller of the MVC pattern, or the presenter of the MVP pattern, MVVM has a binder, which automates communication between the view and its bound properties in the view model. The view model has been described as a state of the data in the model.




                      So, primarily it is (like all other GUI architectural patterns in their root) about abstraction between view and domain parts of the application, so that they can vary independently and subsequent changes to the system will be cheap.




                      • Instantiating domain objects in the view scope and their subsequent use by the view leads to tight coupling between the view and domain objects, which is a bad characteristic of any system. Also, it is one more reason to change view's internals, because if construction logic of the domain object changes - view will have to be changed too.


                      If ViewModel is exessive for you (as I can see, its benefits are not relevant for you in this particular case, because the UI is not very complex and it's state is lightweight), consider using a less heavy-weight abstraction, such as MVP. Thus, you will be able to preserve abstraction between view and model in your application (no unwanted coupling) and you won't have to support the code that you don't benefit from.






                      share|improve this answer



























                        up vote
                        1
                        down vote













                        Here are some points I would advice you to consider:




                        • MVVM as a pattern has it's roots back in 2000-th, for example, here is Martin Fowler's article about the concept, and in 2005 John Gossman announced the pattern in his blog. Yes, it solves the problem with rotation in android's implementation of the pattern, but this problem could be solved without it. MVVM is actualy needen for separation of presentation state from views that are seen to the end user. As Wiki says -



                        The view model is an abstraction of the view exposing public properties and commands. Instead of the controller of the MVC pattern, or the presenter of the MVP pattern, MVVM has a binder, which automates communication between the view and its bound properties in the view model. The view model has been described as a state of the data in the model.




                        So, primarily it is (like all other GUI architectural patterns in their root) about abstraction between view and domain parts of the application, so that they can vary independently and subsequent changes to the system will be cheap.




                        • Instantiating domain objects in the view scope and their subsequent use by the view leads to tight coupling between the view and domain objects, which is a bad characteristic of any system. Also, it is one more reason to change view's internals, because if construction logic of the domain object changes - view will have to be changed too.


                        If ViewModel is exessive for you (as I can see, its benefits are not relevant for you in this particular case, because the UI is not very complex and it's state is lightweight), consider using a less heavy-weight abstraction, such as MVP. Thus, you will be able to preserve abstraction between view and model in your application (no unwanted coupling) and you won't have to support the code that you don't benefit from.






                        share|improve this answer

























                          up vote
                          1
                          down vote










                          up vote
                          1
                          down vote









                          Here are some points I would advice you to consider:




                          • MVVM as a pattern has it's roots back in 2000-th, for example, here is Martin Fowler's article about the concept, and in 2005 John Gossman announced the pattern in his blog. Yes, it solves the problem with rotation in android's implementation of the pattern, but this problem could be solved without it. MVVM is actualy needen for separation of presentation state from views that are seen to the end user. As Wiki says -



                          The view model is an abstraction of the view exposing public properties and commands. Instead of the controller of the MVC pattern, or the presenter of the MVP pattern, MVVM has a binder, which automates communication between the view and its bound properties in the view model. The view model has been described as a state of the data in the model.




                          So, primarily it is (like all other GUI architectural patterns in their root) about abstraction between view and domain parts of the application, so that they can vary independently and subsequent changes to the system will be cheap.




                          • Instantiating domain objects in the view scope and their subsequent use by the view leads to tight coupling between the view and domain objects, which is a bad characteristic of any system. Also, it is one more reason to change view's internals, because if construction logic of the domain object changes - view will have to be changed too.


                          If ViewModel is exessive for you (as I can see, its benefits are not relevant for you in this particular case, because the UI is not very complex and it's state is lightweight), consider using a less heavy-weight abstraction, such as MVP. Thus, you will be able to preserve abstraction between view and model in your application (no unwanted coupling) and you won't have to support the code that you don't benefit from.






                          share|improve this answer














                          Here are some points I would advice you to consider:




                          • MVVM as a pattern has it's roots back in 2000-th, for example, here is Martin Fowler's article about the concept, and in 2005 John Gossman announced the pattern in his blog. Yes, it solves the problem with rotation in android's implementation of the pattern, but this problem could be solved without it. MVVM is actualy needen for separation of presentation state from views that are seen to the end user. As Wiki says -



                          The view model is an abstraction of the view exposing public properties and commands. Instead of the controller of the MVC pattern, or the presenter of the MVP pattern, MVVM has a binder, which automates communication between the view and its bound properties in the view model. The view model has been described as a state of the data in the model.




                          So, primarily it is (like all other GUI architectural patterns in their root) about abstraction between view and domain parts of the application, so that they can vary independently and subsequent changes to the system will be cheap.




                          • Instantiating domain objects in the view scope and their subsequent use by the view leads to tight coupling between the view and domain objects, which is a bad characteristic of any system. Also, it is one more reason to change view's internals, because if construction logic of the domain object changes - view will have to be changed too.


                          If ViewModel is exessive for you (as I can see, its benefits are not relevant for you in this particular case, because the UI is not very complex and it's state is lightweight), consider using a less heavy-weight abstraction, such as MVP. Thus, you will be able to preserve abstraction between view and model in your application (no unwanted coupling) and you won't have to support the code that you don't benefit from.







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited yesterday









                          Benjamin

                          2,40621533




                          2,40621533










                          answered 2 days ago









                          Andrey Ilyunin

                          614217




                          614217






























                               

                              draft saved


                              draft discarded



















































                               


                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53402430%2fandroid-do-i-use-viewmodel-to-perform-insertion-or-update%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Berounka

                              Different font size/position of beamer's navigation symbols template's content depending on regular/plain...

                              Sphinx de Gizeh