SlideShare a Scribd company logo
Android Architecture
Components
Guy Baron, Director Mobile @ Vonage
DroidCon TLV 2017
Android Architecture Components - Guy Bar on, Vonage
Backend SQLite DB UI Users
Retrofit Boilerplate!
Lifecycle?
MVP ?
MVVM ?
Android Architecture Components
Make it easier and more fun to write robust apps, empowering developers to focus
on areas where they can innovate.
Issues like complex lifecycles and the lack of a recommended app architecture
make it challenging to write robust apps.
https://developer.android.com/topic/libraries/architecture/guide.html
Android Architecture Components - Guy Bar on, Vonage
App Architecture Concepts
Abstraction layer over SQLite
● Room - light ORM library
● Allows fluent database access
Repository
● Responsible for handling data
operations.
● Knows where to get the data from and
what API calls to make when data is
updated
Android Architecture Components - Guy Bar on, Vonage
Room
@Entity
class User {
private @PrimaryKey int uid;
private @ColumnInfo(name = "first_name") String firstName;
}
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY first_name ASC")
public abstract List<User> usersByLastName();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
App Architecture Concepts
LiveData
● LiveData is an observable lifecycle-
aware data holder class
Room & LiveData
@Entity
class User {
private @PrimaryKey int uid;
private @ColumnInfo(name = "first_name") String firstName;
}
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY first_name ASC")
public abstract LiveData<List<User>> usersByLastName();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
App Architecture Concepts
ViewModel
● Stores UI-related data in a lifecycle
conscious way
Lifecycle-aware components
● LifecycleOwner / LifecycleObserver
Room & LiveData & ViewModel
@Entity
class User {
private @PrimaryKey int uid;
private @ColumnInfo(name = "first_name") String firstName;
}
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY first_name ASC")
public abstract LiveData<List<User>> usersByLastName();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
class MyViewModel extends ViewModel {
public final LiveData<List<User>> usersList;
public MyViewModel() {
AppDatabase db = Room.databaseBuilder(context,
AppDatabase.class, "database-name").build();
usersList = db.userDao().usersByLastName();
}
}
Room & LiveData & ViewModel & UI
@Entity
class User {
private @PrimaryKey int uid;
private @ColumnInfo(name = "first_name") String firstName;
}
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY first_name ASC")
public abstract LiveData<List<User>> usersByLastName();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
class MyViewModel extends ViewModel {
public final LiveData<List<User>> usersList;
public MyViewModel() {
AppDatabase db = Room.databaseBuilder(context,
AppDatabase.class, "database-name").build();
usersList = db.userDao().usersByLastName();
}
}
class MyActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
MyViewModel viewModel = ViewModelProviders.of(this)
.get(MyViewModel.class);
// ...
}
}
Data Flow
Room
Use Room to store the new data
in the SQLite database for
offline use
ViewModel
Store the data in a ViewModel
object to make it accessible for
UI objects
BE Service
Use the Retrofit library to
access your backend and fetch
for data
LiveData
Use Room to fetch data from
the SQLite database and get
LiveData objects
UI
Activities access the data using
the ViewModel. They observe
and respond to changes
Backend SQLite DB UI Users
Retrofit Room
Lifecycle
LiveData
ViewModel
One more thing… Paging
Why paging is interesting
● We use SQLiteCursor for fetching data from the database
● SQLiteCursor uses a CursorWindow, a buffer of rows typically 2MB in size
● Challenges:
○ SQLiteCursor doesn’t hold any database transaction open
○ SQLiteCursor.getCount() scans entire query
○ SQLiteCursor does not know data has changed
SQLiteCursor doesn’t hold any database transaction open
cursor.moveToPosition(position);
SQLiteCursor doesn’t hold any database transaction open
cursor.moveToNext();
SQLiteCursor.getCount() scans entire query
cursor.getCount();
The Paging library
● Uses small queries
● Queries that fit within a single CursorWindow
Paging flows
Room & LiveData & ViewModel & UI & Paging
@Entity
class User {
private @PrimaryKey int uid;
private @ColumnInfo(name = "first_name") String firstName;
}
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY first_name ASC")
public abstract LiveData<List<User>> usersByLastName();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
Room & LiveData & ViewModel & UI & Paging
@Entity
class User {
private @PrimaryKey int uid;
private @ColumnInfo(name = "first_name") String firstName;
}
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY first_name ASC")
public abstract DataSource.Factory<Integer, User> usersByLastName();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
Room & LiveData & ViewModel & UI & Paging
@Entity
class User {
private @PrimaryKey int uid;
private @ColumnInfo(name = "first_name") String firstName;
}
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY first_name ASC")
public abstract DataSource.Factory<Integer, User> usersByLastName();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
class MyViewModel extends ViewModel {
LiveData<List<User>> usersList;
public MyViewModel() {
AppDatabase db = Room.databaseBuilder(context,
AppDatabase.class, "database-name").build();
usersList = db.userDao().usersByLastName();
}
}
Room & LiveData & ViewModel & UI & Paging
@Entity
class User {
private @PrimaryKey int uid;
private @ColumnInfo(name = "first_name") String firstName;
}
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY first_name ASC")
public abstract DataSource.Factory<Integer, User> usersByLastName();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
class MyViewModel extends ViewModel {
LiveData<PagedList<User>> usersList;
public MyViewModel() {
AppDatabase db = Room.databaseBuilder(context,
AppDatabase.class, "database-name").build();
usersList = new LivePagedListBuilder<>(
db.userDao.usersByLastName(),20).build();
}
}
Room & LiveData & ViewModel & UI & Paging
@Entity
class User {
private @PrimaryKey int uid;
private @ColumnInfo(name = "first_name") String firstName;
}
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY first_name ASC")
public abstract DataSource.Factory<Integer, User> usersByLastName();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
class MyViewModel extends ViewModel {
LiveData<PagedList<User>> usersList;
public MyViewModel() {
AppDatabase db = Room.databaseBuilder(context,
AppDatabase.class, "database-name").build();
usersList = new LivePagedListBuilder<>(
db.userDao.usersByLastName(),20).build();
}
}
class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
MyViewModel viewModel = ViewModelProviders.of(this).
get(MyViewModel.class);
viewModel.usersList.observe(this, new Observer<PagedList<User>>() {
void onChanged(PagedList<User> users) {
adapter.setList(users);
}
});
}
Thank you

More Related Content

PPTX
Android Architecture Components
BurhanuddinRashid
 
PPT
Entity Persistence with JPA
Subin Sugunan
 
ODP
JPA Best Practices
Carol McDonald
 
PDF
Java persistence api 2.1
Rakesh K. Cherukuri
 
PPTX
Introduction to JPA (JPA version 2.0)
ejlp12
 
PDF
Android Components
Aatul Palandurkar
 
PDF
Android Jetpack: ViewModel and Testing
Yongjun Kim
 
ODP
Hibernate complete Training
sourabh aggarwal
 
Android Architecture Components
BurhanuddinRashid
 
Entity Persistence with JPA
Subin Sugunan
 
JPA Best Practices
Carol McDonald
 
Java persistence api 2.1
Rakesh K. Cherukuri
 
Introduction to JPA (JPA version 2.0)
ejlp12
 
Android Components
Aatul Palandurkar
 
Android Jetpack: ViewModel and Testing
Yongjun Kim
 
Hibernate complete Training
sourabh aggarwal
 

What's hot (19)

PPT
Java Persistence API (JPA) Step By Step
Guo Albert
 
PPTX
Introduction to JPA Framework
Collaboration Technologies
 
PDF
Dmytro Zaitsev Viper: make your mvp cleaner
Аліна Шепшелей
 
PPTX
Apache Struts 2 Advance
Emprovise
 
PPTX
Jpa 2.1 Application Development
ThirupathiReddy Vajjala
 
PPTX
JPA For Beginner's
NarayanaMurthy Ganashree
 
PDF
SE2016 Android Mikle Anokhin "Speed up application development with data bind...
Inhacking
 
PPT
jpa-hibernate-presentation
John Slick
 
PDF
[2019] PAYCO 매거진 서버 Kotlin 적용기
NHN FORWARD
 
PDF
JPA 2.1 performance tuning tips
osa_ora
 
ODP
Codemotion appengine
Ignacio Coloma
 
PDF
Advance Java Practical file
varun arora
 
PPTX
Introduction to jQuery
Collaboration Technologies
 
PPTX
Тарас Олексин - Sculpt! Your! Tests!
DataArt
 
PPTX
Intro react js
Vijayakanth MP
 
PPTX
Struts 1
Lalit Garg
 
PDF
Identifing Listeners and Filters
People Strategists
 
PPTX
Reproducible component tests using docker
Pavel Rabetski
 
PDF
Lab3-Android
Lilia Sfaxi
 
Java Persistence API (JPA) Step By Step
Guo Albert
 
Introduction to JPA Framework
Collaboration Technologies
 
Dmytro Zaitsev Viper: make your mvp cleaner
Аліна Шепшелей
 
Apache Struts 2 Advance
Emprovise
 
Jpa 2.1 Application Development
ThirupathiReddy Vajjala
 
JPA For Beginner's
NarayanaMurthy Ganashree
 
SE2016 Android Mikle Anokhin "Speed up application development with data bind...
Inhacking
 
jpa-hibernate-presentation
John Slick
 
[2019] PAYCO 매거진 서버 Kotlin 적용기
NHN FORWARD
 
JPA 2.1 performance tuning tips
osa_ora
 
Codemotion appengine
Ignacio Coloma
 
Advance Java Practical file
varun arora
 
Introduction to jQuery
Collaboration Technologies
 
Тарас Олексин - Sculpt! Your! Tests!
DataArt
 
Intro react js
Vijayakanth MP
 
Struts 1
Lalit Garg
 
Identifing Listeners and Filters
People Strategists
 
Reproducible component tests using docker
Pavel Rabetski
 
Lab3-Android
Lilia Sfaxi
 
Ad

Similar to Android Architecture Components - Guy Bar on, Vonage (20)

PDF
Architecture components - IT Talk
Constantine Mars
 
PDF
Architecture Components
DataArt
 
PDF
A evolução da persistência de dados (com sqlite) no android
Rodrigo de Souza Castro
 
PPTX
The Best Way to Become an Android Developer Expert with Android Jetpack
Ahmad Arif Faizin
 
PDF
Building Modern Apps using Android Architecture Components
Hassan Abid
 
PDF
Architecture Components
Sang Eel Kim
 
PDF
Android Architecture Components with Kotlin
Adit Lal
 
PPTX
Java Technology
ifnu bima
 
PDF
MobiConf 2018 | Room: an SQLite object mapping library
Magda Miu
 
PPTX
Android dev toolbox
Shem Magnezi
 
PPTX
Save data in to sqlite
Junifar hidayat
 
PPTX
Techniques for Cross Platform .NET Development
Jeremy Hutchinson
 
PPTX
Cloud native programming model comparison
Emily Jiang
 
PDF
My way to clean android (EN) - Android day salamanca edition
Christian Panadero
 
PPTX
NoSQL Endgame Percona Live Online 2020
Thodoris Bais
 
PDF
Android best practices
Jose Manuel Ortega Candel
 
PPT
JDBC Tutorial
Information Technology
 
PPT
Struts 2 + Spring
Bryan Hsueh
 
PDF
May 2010 - RestEasy
JBug Italy
 
PDF
RESTEasy
Massimiliano Dessì
 
Architecture components - IT Talk
Constantine Mars
 
Architecture Components
DataArt
 
A evolução da persistência de dados (com sqlite) no android
Rodrigo de Souza Castro
 
The Best Way to Become an Android Developer Expert with Android Jetpack
Ahmad Arif Faizin
 
Building Modern Apps using Android Architecture Components
Hassan Abid
 
Architecture Components
Sang Eel Kim
 
Android Architecture Components with Kotlin
Adit Lal
 
Java Technology
ifnu bima
 
MobiConf 2018 | Room: an SQLite object mapping library
Magda Miu
 
Android dev toolbox
Shem Magnezi
 
Save data in to sqlite
Junifar hidayat
 
Techniques for Cross Platform .NET Development
Jeremy Hutchinson
 
Cloud native programming model comparison
Emily Jiang
 
My way to clean android (EN) - Android day salamanca edition
Christian Panadero
 
NoSQL Endgame Percona Live Online 2020
Thodoris Bais
 
Android best practices
Jose Manuel Ortega Candel
 
JDBC Tutorial
Information Technology
 
Struts 2 + Spring
Bryan Hsueh
 
May 2010 - RestEasy
JBug Italy
 
Ad

More from DroidConTLV (20)

PDF
Mobile Development in the Information Age - Yossi Elkrief, Nike
DroidConTLV
 
PDF
Doing work in the background - Darryn Campbell, Zebra Technologies
DroidConTLV
 
PDF
No more video loss - Alex Rivkin, Motorola Solutions
DroidConTLV
 
PDF
Mobile at Scale: from startup to a big company - Dor Samet, Booking.com
DroidConTLV
 
PDF
LiveData on Steroids - Giora Shevach + Shahar Ben Moshe, Climacell
DroidConTLV
 
PDF
MVVM In real life - Lea Cohen Tannoudji, Lightricks
DroidConTLV
 
PDF
Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)
DroidConTLV
 
PDF
Building Apps with Flutter - Hillel Coren, Invoice Ninja
DroidConTLV
 
PDF
New Android Project: The Most Important Decisions - Vasiliy Zukanov
DroidConTLV
 
PDF
Designing a Design System - Shai Mishali, Gett
DroidConTLV
 
PDF
The Mighty Power of the Accessibility Service - Guy Griv, Pepper
DroidConTLV
 
PDF
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDev
DroidConTLV
 
PDF
Flutter State Management - Moti Bartov, Tikal
DroidConTLV
 
PDF
Reactive UI in android - Gil Goldzweig Goldbaum, 10bis
DroidConTLV
 
PDF
Fun with flutter animations - Divyanshu Bhargava, GoHighLevel
DroidConTLV
 
PDF
DroidconTLV 2019
DroidConTLV
 
PDF
Ok google, it's time to bot! - Hadar Franco, Albert + Stav Levi, Monday
DroidConTLV
 
PDF
Introduction to React Native - Lev Vidrak, Wix
DroidConTLV
 
PDF
Bang-Bang, you have been hacked - Yonatan Levin, KolGene
DroidConTLV
 
PDF
Educating your app – adding ML edge to your apps - Maoz Tamir
DroidConTLV
 
Mobile Development in the Information Age - Yossi Elkrief, Nike
DroidConTLV
 
Doing work in the background - Darryn Campbell, Zebra Technologies
DroidConTLV
 
No more video loss - Alex Rivkin, Motorola Solutions
DroidConTLV
 
Mobile at Scale: from startup to a big company - Dor Samet, Booking.com
DroidConTLV
 
LiveData on Steroids - Giora Shevach + Shahar Ben Moshe, Climacell
DroidConTLV
 
MVVM In real life - Lea Cohen Tannoudji, Lightricks
DroidConTLV
 
Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)
DroidConTLV
 
Building Apps with Flutter - Hillel Coren, Invoice Ninja
DroidConTLV
 
New Android Project: The Most Important Decisions - Vasiliy Zukanov
DroidConTLV
 
Designing a Design System - Shai Mishali, Gett
DroidConTLV
 
The Mighty Power of the Accessibility Service - Guy Griv, Pepper
DroidConTLV
 
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDev
DroidConTLV
 
Flutter State Management - Moti Bartov, Tikal
DroidConTLV
 
Reactive UI in android - Gil Goldzweig Goldbaum, 10bis
DroidConTLV
 
Fun with flutter animations - Divyanshu Bhargava, GoHighLevel
DroidConTLV
 
DroidconTLV 2019
DroidConTLV
 
Ok google, it's time to bot! - Hadar Franco, Albert + Stav Levi, Monday
DroidConTLV
 
Introduction to React Native - Lev Vidrak, Wix
DroidConTLV
 
Bang-Bang, you have been hacked - Yonatan Levin, KolGene
DroidConTLV
 
Educating your app – adding ML edge to your apps - Maoz Tamir
DroidConTLV
 

Recently uploaded (20)

PDF
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
PDF
Brief History of Internet - Early Days of Internet
sutharharshit158
 
PDF
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
PDF
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
PDF
Get More from Fiori Automation - What’s New, What Works, and What’s Next.pdf
Precisely
 
PDF
A Strategic Analysis of the MVNO Wave in Emerging Markets.pdf
IPLOOK Networks
 
PDF
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
PDF
Doc9.....................................
SofiaCollazos
 
PDF
CIFDAQ's Market Wrap : Bears Back in Control?
CIFDAQ
 
PDF
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
PDF
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
PDF
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PDF
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
PPTX
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
PDF
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
PDF
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
PPTX
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
PPTX
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
PDF
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
Brief History of Internet - Early Days of Internet
sutharharshit158
 
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
Get More from Fiori Automation - What’s New, What Works, and What’s Next.pdf
Precisely
 
A Strategic Analysis of the MVNO Wave in Emerging Markets.pdf
IPLOOK Networks
 
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
Doc9.....................................
SofiaCollazos
 
CIFDAQ's Market Wrap : Bears Back in Control?
CIFDAQ
 
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 

Android Architecture Components - Guy Bar on, Vonage

  • 1. Android Architecture Components Guy Baron, Director Mobile @ Vonage DroidCon TLV 2017
  • 3. Backend SQLite DB UI Users Retrofit Boilerplate! Lifecycle? MVP ? MVVM ?
  • 4. Android Architecture Components Make it easier and more fun to write robust apps, empowering developers to focus on areas where they can innovate. Issues like complex lifecycles and the lack of a recommended app architecture make it challenging to write robust apps.
  • 7. App Architecture Concepts Abstraction layer over SQLite ● Room - light ORM library ● Allows fluent database access Repository ● Responsible for handling data operations. ● Knows where to get the data from and what API calls to make when data is updated
  • 9. Room @Entity class User { private @PrimaryKey int uid; private @ColumnInfo(name = "first_name") String firstName; } @Dao interface UserDao { @Query("SELECT * FROM user ORDER BY first_name ASC") public abstract List<User> usersByLastName(); } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
  • 10. App Architecture Concepts LiveData ● LiveData is an observable lifecycle- aware data holder class
  • 11. Room & LiveData @Entity class User { private @PrimaryKey int uid; private @ColumnInfo(name = "first_name") String firstName; } @Dao interface UserDao { @Query("SELECT * FROM user ORDER BY first_name ASC") public abstract LiveData<List<User>> usersByLastName(); } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
  • 12. App Architecture Concepts ViewModel ● Stores UI-related data in a lifecycle conscious way Lifecycle-aware components ● LifecycleOwner / LifecycleObserver
  • 13. Room & LiveData & ViewModel @Entity class User { private @PrimaryKey int uid; private @ColumnInfo(name = "first_name") String firstName; } @Dao interface UserDao { @Query("SELECT * FROM user ORDER BY first_name ASC") public abstract LiveData<List<User>> usersByLastName(); } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } class MyViewModel extends ViewModel { public final LiveData<List<User>> usersList; public MyViewModel() { AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "database-name").build(); usersList = db.userDao().usersByLastName(); } }
  • 14. Room & LiveData & ViewModel & UI @Entity class User { private @PrimaryKey int uid; private @ColumnInfo(name = "first_name") String firstName; } @Dao interface UserDao { @Query("SELECT * FROM user ORDER BY first_name ASC") public abstract LiveData<List<User>> usersByLastName(); } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } class MyViewModel extends ViewModel { public final LiveData<List<User>> usersList; public MyViewModel() { AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "database-name").build(); usersList = db.userDao().usersByLastName(); } } class MyActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedState) { super.onCreate(savedState); MyViewModel viewModel = ViewModelProviders.of(this) .get(MyViewModel.class); // ... } }
  • 15. Data Flow Room Use Room to store the new data in the SQLite database for offline use ViewModel Store the data in a ViewModel object to make it accessible for UI objects BE Service Use the Retrofit library to access your backend and fetch for data LiveData Use Room to fetch data from the SQLite database and get LiveData objects UI Activities access the data using the ViewModel. They observe and respond to changes
  • 16. Backend SQLite DB UI Users Retrofit Room Lifecycle LiveData ViewModel
  • 18. Why paging is interesting ● We use SQLiteCursor for fetching data from the database ● SQLiteCursor uses a CursorWindow, a buffer of rows typically 2MB in size ● Challenges: ○ SQLiteCursor doesn’t hold any database transaction open ○ SQLiteCursor.getCount() scans entire query ○ SQLiteCursor does not know data has changed
  • 19. SQLiteCursor doesn’t hold any database transaction open cursor.moveToPosition(position);
  • 20. SQLiteCursor doesn’t hold any database transaction open cursor.moveToNext();
  • 21. SQLiteCursor.getCount() scans entire query cursor.getCount();
  • 22. The Paging library ● Uses small queries ● Queries that fit within a single CursorWindow
  • 24. Room & LiveData & ViewModel & UI & Paging @Entity class User { private @PrimaryKey int uid; private @ColumnInfo(name = "first_name") String firstName; } @Dao interface UserDao { @Query("SELECT * FROM user ORDER BY first_name ASC") public abstract LiveData<List<User>> usersByLastName(); } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
  • 25. Room & LiveData & ViewModel & UI & Paging @Entity class User { private @PrimaryKey int uid; private @ColumnInfo(name = "first_name") String firstName; } @Dao interface UserDao { @Query("SELECT * FROM user ORDER BY first_name ASC") public abstract DataSource.Factory<Integer, User> usersByLastName(); } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
  • 26. Room & LiveData & ViewModel & UI & Paging @Entity class User { private @PrimaryKey int uid; private @ColumnInfo(name = "first_name") String firstName; } @Dao interface UserDao { @Query("SELECT * FROM user ORDER BY first_name ASC") public abstract DataSource.Factory<Integer, User> usersByLastName(); } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } class MyViewModel extends ViewModel { LiveData<List<User>> usersList; public MyViewModel() { AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "database-name").build(); usersList = db.userDao().usersByLastName(); } }
  • 27. Room & LiveData & ViewModel & UI & Paging @Entity class User { private @PrimaryKey int uid; private @ColumnInfo(name = "first_name") String firstName; } @Dao interface UserDao { @Query("SELECT * FROM user ORDER BY first_name ASC") public abstract DataSource.Factory<Integer, User> usersByLastName(); } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } class MyViewModel extends ViewModel { LiveData<PagedList<User>> usersList; public MyViewModel() { AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "database-name").build(); usersList = new LivePagedListBuilder<>( db.userDao.usersByLastName(),20).build(); } }
  • 28. Room & LiveData & ViewModel & UI & Paging @Entity class User { private @PrimaryKey int uid; private @ColumnInfo(name = "first_name") String firstName; } @Dao interface UserDao { @Query("SELECT * FROM user ORDER BY first_name ASC") public abstract DataSource.Factory<Integer, User> usersByLastName(); } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } class MyViewModel extends ViewModel { LiveData<PagedList<User>> usersList; public MyViewModel() { AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "database-name").build(); usersList = new LivePagedListBuilder<>( db.userDao.usersByLastName(),20).build(); } } class MyActivity extends AppCompatActivity { public void onCreate(Bundle savedState) { super.onCreate(savedState); MyViewModel viewModel = ViewModelProviders.of(this). get(MyViewModel.class); viewModel.usersList.observe(this, new Observer<PagedList<User>>() { void onChanged(PagedList<User> users) { adapter.setList(users); } }); }