Awesome
Android Architecture Components!
Hola!: Bienvenido al Codelab de Android Architecture Components.
Slides: https://goo.gl/yTttTD
Mi nombre es Andrés Vasquez y vengo a mostrarte de manera sencilla una aplicacion que implementa los nuevos componentes de arquitectura de Android. Te dejo mis datos por si tienes dudas:
andres.vasquez.agramont@gmail.com
https://github.com/andres-vasquez
Espero lo disfrutes!
PREPARING THE PROJECT (done)
Step 1: Add maven repository Ve a build.gradle y agrega el repositorio de Google en:
allprojects {
repositories {
...
maven {
url "https://maven.google.com"
}
...
}
}
Step 2: Add architecture libraries Ve a app/build.gradle y agrega las librerías de Android Arch
compile 'android.arch.lifecycle:extensions:1.0.0-alpha1';
compile 'android.arch.persistence.room:runtime:1.0.0-alpha1';
annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha1";
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1";
PREPARING THE DATABASE
Step 3: Prepare database instance Ve a db/AppDatabase.java Línea 33
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class,
DATABASE_NAME).build();
Step 4: Prepare Person table Ve a db/entity/PersonEntity.java Línea 16 y agrega la annotation:
@Entity(tableName = "person")
Step 5: Set id as PrimaryKey Autoincrement Ve a db/entity/PersonEntity.java Línea 18 y agrega la annotation:
@PrimaryKey(autoGenerate = true)
Step 6: Set entities Ve a db/AppDatabase.java Línea 17 y vincula la clase PersonEntity como tabla de la base de datos.
@Database(entities = {PersonEntity.class}, version = 1)
Step 7: Define person table CRUD operations Ve a db/dao/PersonDao.java Línea 21 y agrega las funciones de base de datos.
@Query("SELECT * FROM person")
LiveData<List<PersonEntity>> loadlAllPersons();
@Query("SELECT * FROM person WHERE id = :personId")
LiveData<PersonEntity> loadPerson(int personId);
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(PersonEntity person);
@Update(onConflict = OnConflictStrategy.REPLACE)
void updatePerson(PersonEntity person);
@Query("DELETE FROM person WHERE id=:personId")
void deletePerson(int personId);
PREPARING THE REPOSITORY
Step 8: Define the data access method Ve a repository/PersonRepository.java Línea 14 y agrega los métodos a la interfaz
LiveData<List<PersonEntity>> getPersonList();
LiveData<PersonEntity> getPerson(int personId);
void addPerson(PersonEntity person);
void updatePerson(PersonEntity person);
void deletePerson(PersonEntity person);
Step 9: Connect methods with implementation Ve a repository/PersonRepositoryImpl.java Línea 28 y agrega la capa de acceso a la base de datos
@Override
public LiveData<List<PersonEntity>> getPersonList() {
return mDb.personDao().loadlAllPersons();
}
@Override
public LiveData<PersonEntity> getPerson(int personId) {
return mDb.personDao().loadPerson(personId);
}
@Override
public void addPerson(final PersonEntity person) {
new Thread(){
@Override
public void run() {
mDb.personDao().insert(person);
}
}.start();
}
@Override
public void updatePerson(final PersonEntity person) {
new Thread(){
@Override
public void run() {
mDb.personDao().updatePerson(person);
}
}.start();
}
@Override
public void deletePerson(final PersonEntity person) {
new Thread(){
@Override
public void run() {
mDb.personDao().deletePerson(person.getId());
}
}.start();
}
PREPARING THE VIEWMODEL
Step 10: Bind the person List LiveData Ve a viewmodel/PersonViewModel.java Línea 37 y llena la variable livedata desde la capa de repository
mPersonList = personRepository.getPersonList();
Step 11: Bind the single person LiveData Ve a viewmodel/PersonViewModel.java Línea 52 y llena la variable livedata desde la capa de repository
return personRepository.getPerson(personId);
Nota: Eliminar return null;
PREPARING THE UI
Step 12: Initialize the PersonViewModel Ve a ui/activities/ListActivity.java Línea 88 e inicializa el viewModel
personViewModel = ViewModelProviders.of(this).get(PersonViewModel.class);
Step 13: Subscribe to PersonList observer Ve a ui/activities/ListActivity.java Línea 95 y llega la función subscribeUI
personViewModel.getPersonList().observe(this, new Observer<List<PersonEntity>>() {
@Override
public void onChanged(@Nullable List<PersonEntity> personEntities) {
if(personEntities!=null){
mPersonAdapter.swap(personEntities);
}
}
});
Step 14: Adding create action Ve a ui/fragments/AddFragmentDialog.java Línea 166 y llama al método addPerson
mActivity.personViewModel.personRepository.addPerson(personEntity);
Step 15: Adding update action Ve a ui/fragments/AddFragmentDialog.java Línea 169 y llama al método updatePerson
mActivity.personViewModel.personRepository.updatePerson(personEntity);
Step 16: Subscribe single person observer Ve a ui/fragments/AddFragmentDialog.java Línea 135 y susbribete a observerPerson para analizar los cambios que el objeto persona pueda tener
mActivity.personViewModel.getPerson(mPersonId).observe(mActivity, observerPerson);
Step 17: Adding delete action Ve a ui/activities/ListActivity.java Línea 129 y llama al método deletePerson
personViewModel.personRepository.deletePerson(person);
Problems?
Si tienes problemas o no puedes hacer algun paso puedes cambiar al branch Complete y ver el ejemplo funcionando!