معرفی Android Architecture Components: Room 

چهارشنبه ۰۸ فروردین ۹۷ توسط یوسف رضا مختاری

معرفی

بتازگی گوگل مجموعه ای از کتابخانه ها و کامپوننت ها را برای طراحی معماری اندروید به نام Android Architecture Components  معرفی کرده است .

با این مجموعه از کتابخانه ها ما قادر به ایجاد برنامه ای سازگار و قابل تست و قابل نگهداری هستیم.

کامپوننت هایی شامل:

  • Room  — کتابخانه پایگاه داده
  • Lifecycle Components (شامل LiveData , ViewModel , LifecycleObservers و LifecycleOwners) — یک کتابخانه برای مدیریت lifecycle برنامه شما
  • Paging Library   — یک کتابخانه کوچک برای کمک به load تدریجی داده ها

امروز ما میخواهیم روی کتابخانه Room متمرکز شویم . بیایید شروع کنیم!

Room چیست ؟

Room یک کتابخانه پایگاه داده است .

همان طور که می دانید دیتابیس پیش فرض اندروید SQLite می باشد که به زبان SQL می باشد و

برای کار کردن با آن نیاز به کلاس های Helper مخصوص این دیتابیس می باشد که پیچییدگی های خاص خود را دارد .

در این میان دیتابیس های ORM به عنوان پلی میان برنامه نویس و پایگاه داده عمل میکنند و عملیات ساخت و مدیریت پایگاه داده را انجام میدهند .

اساسا Room با حاشیه نویسی (annotation) , استفاده از SQLite را برای ما آسان تر می کند .

بنابراین ما میتوانیم بدون نگرانی به نوشتن بیشتر کدهای SQLite و صحت درستی آن ها بپردازیم .

 

چرا از یک پایگاه داده دیگر استفاده نکنیم؟

البته گزینه های مختلفی موجود می باشد تا به عنوان پایگاه داده در برنامه خود استفاده کنید.

شما میتوانید اینکار را با راه حل هایی موجود اندروید (مثلا SQLiteOpenHelper  ) یا

از یک کتابخانه (مثل Realm , OrmLite , greenDAO و ...) استفاده کنید .

با این وجود هیچ کدام از این راه حل ها , مزیتی ندارند. در  Room :

  • پرس و جو (query ) ها در زمان کامپایل تایید میشوند — هر Query@ و Entity@ در زمان کامپایل مورد بررسی قرار میگیرند . بنابراین هیچ خطری در زمان اجرا وجود ندارد که باعث crash شدن اپلیکیشن شود . ( تنها syntax را بررسی نمی کند بلکه جداول موجود را هم چک می کند )
  • Boilerplate در آن بسیار کم است .
  • با سایر اجزا معماری کاملا سازگار و یکپارچه می باشد( مثل LiveData ) .

چگونه از آن استفاده کنید؟

مرحله اول – اضافه کردن dependency ها

خب فرض کنیم من شما را متقاعد کرده ام که از Room در پروژه خود استفاده کنید . چگونه این کار را انجام بدیم؟

ابتدا باید Google Maven را به فایل build.gradle خود اضافه کنیم :

allprojects {
    repositories {
        jcenter()
        google()
    }
}

و سپس dependency های زیر را به فایل app/build.gradle اضافه میکنیم .

implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0' 

 - در اینجا ما از جاوا استفاده میکنیم . اگر شما از kotlin استفاده می کنید شما نیاز به جایگزینی annotationProcessor  با kapt و استفاده از پلاگین kotlin-kapt دارید .

 - با استفاده از vpn پروژه را sync کنید .

 

مرحله دوم – ایجاد یک موجودیت ( entity )

حالا ما برای ایجاد پایگاه داده مان آماده هستیم. بیایید فرض کنیم ما قصد داریم همه مخزن های یک کاربر خاص را از Github بگیریم.

در ابتدا ما یک موجودیت به اسم Repo ایجاد میکنیم :

import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import android.support.annotation.NonNull;

@Entity
public class Repo {
    @PrimaryKey
    public final String id;
    public final String name;
    public final String url;

    public Repo(int id, String name, String url) {
        this.id = id;
        this.name = name;
        this.url = url;
    }
}

دو مورد برای موجودیت لازم است:

  • حاشیه نویسی موجودیت ( Entity@ ) در کلاس. ( برای اینکه به Room اطلاع بدیم کلاس ایجاد شده یک مدل دیتابیس می باشد)
  • حداقل یک فیلد PrimaryKey@

 

مرحله سوم – ایجاد DAO

ما باید برای موجودیت خود DAO ایجاد کنیم . DAO مخفف Data Access Object می باشد.

بنابراین این یک راه برای تعریف و نحوه قرار دادن داده ها در پایگاه می باشد.

import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;
import java.util.List;

@Dao
public interface RepoDao {

    @Query("SELECT * FROM repo")
    List getAllRepos();

    @Insert
    void insert(Repo... repos);

    @Update
    void update(Repo... repos);

    @Delete
    void delete(Repo... repos);
}

همان طور که می بینید در اینجا از روش های مختلفی استفاده شده است:

  • Insert , @Update , @Delete@ برای عملیات حذف و بروزرسانی و اضافه کردن record ها .
  • Query@ برای ایجاد پرس و جو —  select کردن (به عنوان مثال گرفتن همه repo ها ) .

نکته مهم در اینجا این است که ما می توانیم کوئری های خیلی ساده یا خیلی پیشرفته را با استفاده از Query@ پیاده سازی کنیم .

و هم چنین کوئری های اولیه مثل Insert , @Update , @Delete@ وجود دارند که میتوانیم از آن ها استفاده کنیم .

برای مثال برای Insert می توانیم سه روش مختلف داشته باشیم .

@Insert
void insert(Repo... repos);

@Insert
void insert(Repo repo);

@Insert
void insert(List repoList);

برای Query@ ها نیز همین طور می باشد . شما میتوانید یک لیست برگردانید یا حتی یک Cursor قدیمی !!!

@Query("SELECT * FROM repo")
List getAllRepos();

@Query("SELECT * FROM repo WHERE id=:id")
Repo getRepo(int id);

@Query("SELECT * FROM repo")
Cursor getRepoCursor();

 شما میتوانید repository ها براساس نام خاص یا محدوده ای خاص دریافت کنید . 

@Query("SELECT * FROM repo WHERE name=:name")
List getReposByName(String name);

@Query("SELECT * FROM repo WHERE name=:name LIMIT :max")
List getReposByName(int max, String... name);

 

مرحله چهارم – ایجاد دیتابیس

import android.arch.persistence.room.Database;
import android.arch.persistence.room.Room;
import android.arch.persistence.room.RoomDatabase;
import android.content.Context;
import android.support.annotation.NonNull;

@Database(entities = { Repo.class }, version = 1)
public abstract class RepoDatabase extends RoomDatabase {

    private static final String DB_NAME = "repoDatabase.db";
    private static volatile RepoDatabase instance;

    static synchronized RepoDatabase getInstance(Context context) {
        if (instance == null) {
            instance = create(context);
        }
        return instance;
    }

    private static RepoDatabase create(final Context context) {
        return Room.databaseBuilder(
            context,
            RepoDatabase.class,
            DB_NAME).build();
    }

    public abstract RepoDao getRepoDao();
}

اینجا چی داریم؟

در ابتدا یک Database@ داریم که نشان می دهد دیتابیس ما  به کلاس مورد نظر مدل شده و سپس نسخه پایگاه داده که در آن مشخص می شود.

سپس متد ()getInstance را داریم که چیزی به جز یک الگو ساده نمی باشد که البته ضروری می باشد زیرا براساس مستندات داریم:

 […] هر نمونه از  RoomDatabase  نسبتا پرهزینه می باشد و شما به ندرت به چند مورد از آن نیاز دارید.

در خط بعد ما متد ()create را که به صورت static تعریف شده است داریم .

برای ایجاد پایگاه داده ما نیاز به Context , کلاس پایگاه داده و هم چنین نام پایگاه داده داریم که به این متد پاس داده شده است.

در آخر متد ()getRepoDao که به صورت انتزاعی یا abstract  تعریف شده را داریم.

این بسیار مهم است زیرا کلاس پایگاه داده باید حداقل موارد زیر را دارا باشد :

  • حاشیه نویسی پایگاه داده ( Database@ ) .
  • به صورت abstract باشد و از کلاس RoomDatabase ارث بری کند .
  • دارای یک متد abstract بدون پارامتر باشد که کلاسی که با Dao@ نوشته شده را برمیگرداند ( در این مورد ()getRepoDao ) .

 

مرحله 5 - پایگاه داده شما اینجاست!

در نهایت ما قادر به ایجاد query ها و اضافه کردن به پایگاه داده خود هستیم . بیایید این کار را به صورت عملی ببینیم!

مهم این است که همه کارها باید در background thread  (نخ پس زمینه ) انجام شود.

شما میتوانید این کار با استفاده از AsyncTask , RxJava , Handler یا هر چیز دیگری انجام دهید.

برای اضافه کردن اشیا به پایگاه داده نیاز به فراخوانی آن داریم :

RepoDatabase
        .getInstance(context)
        .getRepoDao()
        .insert(new Repo(1, "Cool Repo Name", "url"));

و برای گرفتن اشیا نیز کار بسیار ساده می باشد :

List allRepos = RepoDatabase
        .getInstance(MainActivity.this)
        .getRepoDao()
        .getAllRepos();


 

امیدوارم این مطلب برای شما مفید بوده باشد .

 

 
 

کلیدواژه: آموزش برنامه نویسی اندروید آموزش دیتابیس Room Room اندروید کار با دیتابیس اندروید Android Architecture Components Android Room

منابع: android.jlelse.eu

دیدگاه ها:
۲ سال قبل
reply
دست شما درد نکنه . خیلی وقت بود منتظر این بودم که سایت شما بیاد و این مبحث رو یاد بده . امیدوارم به تولید ویدئوی آموزشی هم بکشه این جریان
۱ سال قبل
reply
یک سوال داشتم اگه بخوام از یک دیتابیس خارجی استفاده کنم بایدچکارکنم
ممنون می شم اگه راهنمای کنید
۱ سال قبل در پاسخ به MISIM
reply
بعد اینکه دیتابیس رو تو نرم افزار مورد نظر و دلخواه خودتون ایجاد کردید اون رو تو پوشه asset پروژه خود در اندروید استودیو قرار میدهید...برای توضیحات بیشتر سوال خودتون رو در گروه پرسش و پاسخ آرکادمی قرار بدید...
۱۱ ماه قبل
reply
عرض سلام و خسته نباشید
امکان آموزش ویدویی برای این کتابخانه رو دارید؟
اگه زودتر بزارید ممنون میشم
۲ ماه قبل
reply
با سلام
ممنون از آموزش خوبتون
فقط یه مشکلی در کد ها هست
در interface RepoDao , لیست ها مقداردهی نشده اند
و اگر کابری کد های شما رو کپی کنه به مشکل میخوره ...
یه خواهش دیگه اینکه
در اپدین کد ها در صور امکان مثالی از اجرای کد ها در Handler بزنید ... سچاس فراوان
ارسال دیدگاه:
برای ارسال دیگاه باید به سیستم وارد شوید و یا ثبت نام کنید. ثبت نام چند لحظه بیشتر زمان شما را نمیگیرد.