Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Architecture Components, pas de maux de...

Android Architecture Components, pas de maux de tête !

Android architecture components ,Un ensemble de guides et librairies qui nous permettent de créer plus facilement des applications robustes, testables et maintenables

Avatar for David Kathoh

David Kathoh

November 10, 2018

More Decks by David Kathoh

Other Decks in Programming

Transcript

  1. Android Architecture Components Un ensemble de guides et librairies qui

    nous permettent de créer plus facilement des applications robustes, testables et maintenables
  2. 7 Architecture Components Room Live Data View Model Goma Lifecycle

    Components Paging Library Navigation Component Work Manager
  3. 8 Configuration dependencies { //Room implementation "android.arch.persistence.room:runtime:”1.1.1” annotationProcessor "android.arch.persistence.room:compiler:”1.1.1” //

    ViewModel and LiveData implementation "android.arch.lifecycle:extensions:”1.1.1” allprojects { repositories { jcenter() google() } } Build.gradle(Project) Build.gradle(Module)
  4. Pourquoi Room? Room permet de créer facilement des bases de

    données. Grâce aux annotations il élimine une grande partie du code que vous deviez écrire précédemment pour stocker des données dans vos applications Android. GOMA
  5. 11 composants de room • Entités: correspondent à des tables

    dans la base de données • Daos: Data access object;Contiennent les méthodes qui gerent l’ecriture et la lecture sur la base de données • Database: Pour creer une nouvelle base de données ou s'y connecter si elle existe deja. Goma
  6. 12 Personne Id Nom sex 1 Filip Keyser Masculin 2

    Annyce Davis Feminin @Entity : Personne Table
  7. public class Personne { private int id; private String nom;

    private String sex; public Personne(String nom, String sex) { this.nom = nom; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNom() { return nom; } . Classe normale GOMA
  8. @Entity(tableName = "personne") public class Personne { @PrimaryKey(autoGenerate = true)

    private int id; private String nom; private String sex; public Personne(String nom, String sex) { this.nom = nom; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNom() { return nom; } . GOMA
  9. @Entity(tableName = "personne") public class Personne { @PrimaryKey(autoGenerate = true)

    private int id; private String nom; private String sex; public Personne(String nom, String sex) { this.nom = nom; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNom() { return nom; } . GOMA @Entity annotation considere la classe comme une table
  10. @Entity(tableName = "personne") public class Personne { @PrimaryKey(autoGenerate = true)

    private int id; private String nom; private String sex; public Personne(String nom, String sex) { this.nom = nom; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNom() { return nom; } . GOMA Propriété tableName Pour changer le nom De la table
  11. @Entity(tableName = "personne") public class Personne { @PrimaryKey(autoGenerate = true)

    private int id; private String nom; private String sex; public Personne(String nom, String sex) { this.nom = nom; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNom() { return nom; } . GOMA Tous les variables de classe deviennent de colonnes ( ou bien @ignore)
  12. @Entity(tableName = "personne") public class Personne { @PrimaryKey(autoGenerate = true)

    private int id; private String nom; private String sex; public Personne(String nom, String sex) { this.nom = nom; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNom() { return nom; } . GOMA clé primaire obligatoire. (autoGenerate = auto-incrementation)
  13. @Entity(tableName = "personne") public class Personne { @PrimaryKey(autoGenerate = true)

    private int id; private String nom; private String sex; public Personne(String nom, String sex) { this.nom = nom; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNom() { return nom; } . GOMA Getters et setters ou soit les variables public
  14. @Dao public interface PersonneDao { @Query("select * from personne") List<Personne>

    allPersonnes(); @Insert void insertPersonne(Personne personne); @Delete void deletePersonne(Personne personne); @Update void updatePersonne(Personne personne); } GOMA
  15. @Dao public interface PersonneDao { @Query("select * from personne") List<Personne>

    allPersonnes(); @Insert void insertPersonne(Personne personne); @Delete void deletePersonne(Personne personne); @Update void updatePersonne(Personne personne); } GOMA @Dao Data Access Object doit être une interface ou soit une abstract Classe
  16. @Dao public interface PersonneDao { @Query("select * from personne") List<Personne>

    allPersonnes(); @Insert void insertPersonne(Personne personne); @Delete void deletePersonne(Personne personne); } GOMA @Insert@Delete@Update Pour de petite requete
  17. @Dao public interface PersonneDao { @Query("select * from personne") List<Personne>

    allPersonnes(); @Insert void insertPersonne(Personne personne); @Delete void deletePersonne(Personne personne); } GOMA Pour de requete (complexe) Sqlite
  18. @Database (entities = {Personne.class} , version = 1,exportSchema = false)

    public abstract class AppDatabase extends RoomDatabase { public abstract PersonneDao personneDao(); } GOMA @Database Annotation @Database Abstract Classe et heriter RoomDatabase
  19. @Database(entities = {Personne.class} , version = 1,exportSchema = false) public

    abstract class AppDatabase extends RoomDatabase { private static final String DATABASE_NAME = "dev_fest_goma"; private static AppDatabase sInstance; public static AppDatabase getInstance(Context context) { if (sInstance == null) { sInstance = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, AppDatabase.DATABASE_NAME) .allowMainThreadQueries() .build(); } return sInstance; } public abstract PersonneDao personneDao(); } GOMA
  20. private static AppDatabase sInstance; public static AppDatabase getInstance(Context context) {

    if (sInstance == null) { sInstance = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, AppDatabase.DATABASE_NAME) .allowMainThreadQueries() .build(); } return sInstance; } GOMA Singleton Pattern
  21. @Database(entities = {Personne.class} , version = 1,exportSchema = false) public

    abstract class AppDatabase extends RoomDatabase { private static final String DATABASE_NAME = "dev_fest_goma"; private static AppDatabase sInstance; public static AppDatabase getInstance(Context context) { if (sInstance == null) { sInstance = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, AppDatabase.DATABASE_NAME) .allowMainThreadQueries() .build(); } return sInstance; } public abstract PersonneDao personneDao(); } GOMA
  22. public class AddPersonActivity extends AppCompatActivity { ……. private AppDatabase mDb;

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_person); mDb =AppDatabase.getInstance(this); mSaveBtn.setOnClickListener(v->{ String name = mName.getText().toString(); String gender = getGenderFromView(); Personne personne = new Personne(name,gender); mDb.personneDao().insertPersonne(personne); }); } ………….. GOMA
  23. LiveData LiveData vous permet d'observer les modifications apportées aux données

    de plusieurs composants de votre application. En combinant LiveData avec Room ,vous avez la possibilité de recevoir des mises à jour automatiques de la base de données.
  24. @Dao public interface PersonneDao { @Query("select * from personne") LiveData

    <List<Personne>> allPersonnes(); //…..etc } GOMA
  25. public class MainActivity extends AppCompatActivity { private AppDatabase mDb; @Override

    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDb = AppDatabase.getInstance(this); LiveData<List<Personne>> personnes = mDb.personneDaoDao().allPersonnes(); personnes.observe(this, new Observer<List<Personne>>() { @Override public void onChanged(@Nullable List<Personne> personnes) { //getting updated list of personnes } }); GOMA
  26. ViewModel La classe ViewModel est conçue pour stocker et gérer

    les données liées à l'interface utilisateur en tenant compte du cycle de vie. La classe ViewModel permet aux données de survivre aux modifications de configuration telles que les rotations d'écran.
  27. Benefice du viewNodel • Survivre aux changements de configuration. •

    Separation de responsabilites • Pas de Business Logic dans le UI Controleur Location
  28. 41 public class MainViewModel extends AndroidViewModel { private AppDatabase mDb;

    private LiveData<List<Personne>> mPersonneList; public MainViewModel(@NonNull Application application) { super(application); mDb = AppDatabase.getInstance(this.getApplication()); mPersonneList = mDb.personneDao().allPersonnes(); } public LiveData<List<Personne>> getPersonneList() { return mPersonneList; } }
  29. 42 public class MainActivity extends AppCompatActivity { @Override protected void

    onCreate(Bundle savedInstanceState) { MainViewModel viewModel = ViewModelProviders.of(this).get(MainViewModel.class); viewModel.getPersonneList().observe(this, new Observer<List<Personne>>() { @Override public void onChanged(@Nullable List<Personne> personnes) { //getting personnes list } }); }