Architecture Components menggunakan Room Persistence Library

Hafid Ali Mustaqim
Udacoding
Published in
5 min readOct 7, 2019
Architecture Component Android

Pada bahasan kali ini kita akan belajar tentang architecture component menggunakan room, Architecure component memiliki beberapa kelebihan antara lain Design robust(Aplikasi kuat), testable(bisa di testring), and maintainable apps(dipelihara). nah pada kesempatan kali ini kita akan mempraktekan arsitekur di Room. room sendiri merupakan sebuah library android studio untuk penyimpanan offline.

Selanjutnya, kita akan mempraktekkan nya :

  1. buat project baru beri nama Room Arch Compontent saat memilih activity pilihlah yang basic activity, dan kali ini kita akan menggunakan bahasa pemrograman java
create new project

2. setelah dibuat kemudian import terlebih dahulu library yang diperlukan :
a. buka build.gradle (module app) sesuaikan kode seperti dibawah ini :

implementation "androidx.room:room-runtime:$rootProject.roomVersion"annotationProcessor "androidx.room:room-compiler:$rootProject.roomVersion"androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.archLifecycleVersion"annotationProcessor "androidx.lifecycle:lifecycle-compiler:$rootProject.archLifecycleVersion"

b. kemudian buka build.gradle (project : root)

ext {roomVersion = '2.2.0-beta01'archLifecycleVersion = '2.2.0-alpha03'coreTestingVersion = "2.1.0-rc01"}

3. kemudian buat package baru beri nama entity, entity ini berisi model / data

pada kelas Word isikan seperti ini :

@Entity(tableName = "word_tb")public class Word {@PrimaryKey@NonNull@ColumnInfo(name = "word")private String word;public Word(String word) {this.word = word;}public String getWord() {return word;}public void setWord(String word) {this.word = word;}}

4. setelah itu kita buat package baru beri nama database, didalam package tersebut berisi beberapa kelas

5. pada WOrdDao, sesuaikan kode seperti ini :pada WOrdDao, sesuaikan kode seperti ini :

@Daopublic interface WordDao {//query@Query("SELECT * FROM word_tb ORDER BY word ASC ")LiveData<List<Word>> getAlphabetWord();//insert@Insert(onConflict = OnConflictStrategy.IGNORE)void insert (Word word);//delete@Query("DELETE from word_tb")void deleteAll();}

6. pada WordRepository :

public class WordRepository {private WordDao mWordDao;private LiveData<List<Word>> mAllWord;public WordRepository(Application application) {WordRoomDatabase db = WordRoomDatabase.getDatabase(application);mWordDao = db.wordDao();mAllWord = mWordDao.getAlphabetWord();}public LiveData<List<Word>> getmAllWord() {return mAllWord;}public void insert(Word word) {new InserAsyncTask(mWordDao).execute(word);}private static class InserAsyncTask extends AsyncTask<Word, Void, Void> {private WordDao mAsyncTaskDao;InserAsyncTask(WordDao dao) {mAsyncTaskDao = dao;}@Overrideprotected Void doInBackground(Word... words) {mAsyncTaskDao.insert(words[0]);return null;}}}

7. WordRoomDatabase :

@Database(entities = {Word.class}, version = 1)abstract public class WordRoomDatabase extends RoomDatabase {public abstract WordDao wordDao();private static WordRoomDatabase INSTANCE;static WordRoomDatabase getDatabase(final Context context) {if (INSTANCE == null) {synchronized (WordRoomDatabase.class) {if (INSTANCE == null) {INSTANCE = Room.databaseBuilder(context.getApplicationContext(),WordRoomDatabase.class, "nama_db.db").fallbackToDestructiveMigration().addCallback(sRoomDatabaseCallback).build();}}}return INSTANCE;}private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback(){@Overridepublic void onOpen(@NonNull SupportSQLiteDatabase db) {super.onOpen(db);new PopulateDbAsync(INSTANCE).execute();}};private static class PopulateDbAsync extends AsyncTask<Void, Void, Void>{private final WordDao mDao;private PopulateDbAsync(WordRoomDatabase mDao) {this.mDao = mDao.wordDao();}@Overrideprotected Void doInBackground(Void... voids) {mDao.deleteAll();Word word = new Word("Data Pertama");mDao.insert(word);word = new Word("Data kedua");mDao.insert(word);return null;}}}

8. buat package baru beri nama viewmodel , didalam package tersebut beri kelas baru namanya WordViewModel :

public class WordViewModel extends AndroidViewModel {private WordRepository wordRepository;private LiveData<List<Word>> mAllWord;public LiveData<List<Word>> getmAllWord() {return mAllWord;}public void insert (Word word){wordRepository.insert(word);}public WordViewModel(Application application){super(application);wordRepository = new WordRepository(application);mAllWord = wordRepository.getmAllWord();}}

9. selanjutnya buat activity baru beri nama InsertActivity, buka layoutnya terlebih dahulu sesuaikan :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".InsertActivity"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="insert word"android:id="@+id/edtInser"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btnSave"android:text="save"/></LinearLayout>

10. Pada Insert Activity :

public class InsertActivity extends AppCompatActivity {EditText edtInsert;Button btnInser;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_insert);edtInsert = findViewById(R.id.edtInser);btnInser = findViewById(R.id.btnSave);btnInser.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent replyIntent = new Intent();if (TextUtils.isEmpty(edtInsert.getText())){setResult(RESULT_CANCELED, replyIntent);}else {String word = edtInsert.getText().toString();replyIntent.putExtra("WORD", word);setResult(RESULT_OK, replyIntent);}finish();}});}}

11. buat package adapter, beri nama WordAdapter :

public class WordAdapter extends RecyclerView.Adapter<WordAdapter.WordViewHolder> {private final LayoutInflater mInflater;private List<Word> mWords = Collections.emptyList();public WordAdapter(Context context) {this.mInflater = LayoutInflater.from(context);}@NonNull@Overridepublic WordAdapter.WordViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View itemView = mInflater.inflate(R.layout.item_adapter, parent, false);return new WordViewHolder(itemView);}@Overridepublic void onBindViewHolder(@NonNull WordAdapter.WordViewHolder holder, int position) {Word current = mWords.get(position);holder.textView.setText(current.getWord());}public void extsetWord(List<Word>words){mWords = words;notifyDataSetChanged();}@Overridepublic int getItemCount() {return mWords.size();}public class WordViewHolder extends RecyclerView.ViewHolder {private TextView textView;public WordViewHolder(@NonNull View itemView) {super(itemView);textView = itemView.findViewById(R.id.tv_word);}}}

12. buat layout baru untuk menampung view , beri nama item_adapter.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/tv_word"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginStart="10dp"android:textSize="20sp"android:textStyle="bold"android:layout_marginLeft="10dp" /></LinearLayout>

13. Langkah terakhir buka MainActivity :

public class MainActivity extends AppCompatActivity {private WordViewModel mWordViewModel;RecyclerView rvWord;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = findViewById(R.id.toolbar);setSupportActionBar(toolbar);final WordAdapter adapter = new WordAdapter(this);rvWord = findViewById(R.id.rvWord);rvWord.setAdapter(adapter);ViewModelProvider provider = new ViewModelProvider(this);mWordViewModel = provider.get(WordViewModel.class);mWordViewModel.getmAllWord().observe(this, new Observer<List<Word>>() {@Overridepublic void onChanged(List<Word> words) {//                Log.e("Data", "Isi data"+words.get(0).getWord());adapter.extsetWord(words);}});FloatingActionButton fab = findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this, InsertActivity.class);startActivityForResult(intent, 1);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 1 && resultCode == RESULT_OK){Word word = new Word(data.getStringExtra("WORD"));mWordViewModel.insert(word);}else{Toast.makeText(this, "data tidak tersimpan", Toast.LENGTH_SHORT).show();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}}

14. Coba Run Project

kemudian

--

--