همانطور که در مقاله انواع دیتابیس ها به معرفی دیتابیس ها پرداخته شد، SQLite یکی از آن پایگاه داده های معرفی شده است که به عنوان کتابخانه اصلی در سیستم عامل اندروید (Android) به حساب می آید. SQLite در توسعه برنامه های اندروید مورد استفاده قرار می گیرد و شاید برای شما نیز سوال باشد که SQLite چگونه برنامه های اندروید را توسعه می دهد؟ در جواب این سوال لازم است بگوییم که دیتابیس SQLite توسط ابزاری به نام room این کار را انجام می دهد. شما به وسیله این مقاله به راحتی می توانید با room آشنا شوید و جواب سوال های خود را بدست آورید.

 Room چیست؟

 

 Room چیست ؟ | بی لرن

 

Room یک object relational mapper) ORM) می باشد که برای پایگاه داده SQLite در اندروید طراحی و تولید شده است و به وسیله گوگل منتشر گردیده است. زمانی که کد‌های خود را در Room می ‌نویسید، آن کد‌ها به کد‌های SQLite تبدیل می شوند. Room باعث افزایش سرعت ایجاد پایگاه داده در اندروید می شود. Room به صورت یک لایه انتزاعی بر روی پایگاه داده داخلی SQLite عمل می کند.

 

بنر مقاله مقایسه دیتابیس ها | بی لرن

 

ORM چیست؟

ORM مخفف عبارت Object-Relational Mapping می باشد که به عنوان یک روش در زبان های backend مثل c# یا جاوا به حساب می آید و استفاده می شود. برای هر زبان Orm مخصوص آن زبان وجود دارد که Orm معروف زبان سی شارپ، enitiy framework می باشد که در سال ۲۰۱۸ معرفی شده است.  در روش های قدیمی دسترسی به دیتابیس باید کئوری نوشته می شد، اما با کمک Orm می توانید به راحتی با دیتابیس متصل شوید و با آن کار کنید. به مثال زیر توجه نمایید.

دریافت اطلاعات کاربران در روش سنتی

SELECT * FROM USER

 

مشکلات این روش

  • وقتی تعداد ستون های جدول زیاد است و کوئری ها پیچیده است احتمال خطا زیاد می شود.
  • توسعه و نوشتن دستورات دشوار می باشد.
  • در اتصال به پایگاه داده های دیگر نیاز به تغییر تمام کوئری ها داریم.

 

دریافت اطلاعات کاربران با entity framework در سی شارپ

db.users.tolist

 

مزیت استفاده از orm در ارتباط با دیتابیس

  • کاهش و مشاهده خطا در زمان کامپایال
  • آپ دیت مدل شما با تغییر دیتابیس (db.users.edit(newuser)db.savechage)
  • مهیا شدن استفاده از dal یا همون data access layer با Orm

 

سه کامپوننت اصلی Room 

سه کامپوننت اصلی Room | بی لرن

Database

room از پایگاه‌ داده و به عنوان نقطه دسترسی اصلی برای اتصال اساسی با برنامه کاربردی استفاده می کند.

@Database(entities = {User.class}, version = 1)

public abstract class AppDatabase extends RoomDatabase {

public abstract UserDao userDao();

}

 

Entity

Entity در دیتابیس Room به معنی جدول می باشد که به آن Table نیز گفته می شود. شما در دیتابیس Sqlite می توانید جداول مربوط به دیتابیس خود را بسازید.

@Entity
class User {
@PrimaryKey
public int id;

public String firstName;
public String lastName;

@Ignore
Bitmap picture;
}

 

annotation های مفید و ویژگی 

  • Foreign keys: نام کلیدهای خارجی
  • Indices: لیست نشانگرهای موجود در جدول
  • Primary keys :نام کلیدهای اصلیentity
  • table name: نام جدول

 

DAO.3

DAO مخفف کلمه Database Access Object می باشد که از یک سری متد ها ساخته شده است.  

@Dao
public interface UserDao {
@Query(“SELECT * FROM user”)
List<User> getAll();

@Query(“SELECT * FROM user WHERE uid IN (:userIds)”)
List<User> loadAllByIds(int[] userIds);

@Query(“SELECT * FROM user WHERE first_name LIKE :first AND “
+ “last_name LIKE :last LIMIT 1”)
User findByName(String first, String last);

@Insert
void insertAll(User… users);

@Delete
void delete(User user);
}

 

۴ annotation

  • Qury: برای اجرای query خام باید از این انوتیشن استفاده شود.
  • Insert: برای وارد کردن داده ها به دیتابیس می توانید این انوتیشن استفاده کنید.
  • Update: شما با کمک این انوتیشن می توانید عملیات به روز رسانی روی داده های موجود در دیتابیس خود را انجام دهید.
  • Delete: این انوتیشن برای پاک کردن داده ها از روی دیتابیس استفاده می شود.

 

راه اندازی یک پروژه جدید با Room

 

راه اندازی یک پروژه جدید با روم | بی لرن

 

برای راه اندازی یک پروژه جدید با Room، باید مراحل زیر را انجام دهید.

مرحله اول

ایجاد یک پروژه جدید در اندروید استودیو

مرحله دوم

اضافه کردن کد ها یا وابستگی ‌های زیر در فایل build.gradle سطح آپ

dependencies {
def room_version = “2.2.5”

implementation “androidx.room:room-runtime:$room_version”
annotationProcessor “androidx.room:room-compiler:$room_version”

 

مرحله سوم

در فایل build.gradle سطح پروژه خود، وارد بخش repositories شوید و مطمئن شوید که عبارت ()google اضافه شده است. اطلاعات فایل شما باید به صورت زیر باشد.

repositories {

google()

jcenter()

}

پس از اضافه شدن ()google فایل شما، پروژه خود را همگام سازی نمایید و در نهایت پروژه شما آماده کار با Room می باشد.

 

نحوه پیاده سازی دیتابیس Room در سورس اندروید

 

یاده سازی دیتابیس Room | بی لرن

 

Entity 

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

SQLite database‌

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

DAO

شما باید تمامی کویری هایی که در دیتابیس استفاده می شود را در این کلاس فراخوانی نمایید. این کویری ها @Delete , @Insert ,Update می باشند.

مخفف عبارت Data access object است . ی که  کنید باید شوند. 

Room database 

SQLiteOpenHelper بالاترین سطح SQLite database می باشد  که برای مدیریت مورد استفاده قرار می گیرد. شما به کمک کلاس DAO می توانید تمام کویری ها را مدیریت و پردازش نمایید.

Repository 

Repository کلاسی می باشد که به وسیله شما ساخته می شود. این کلاس وظیفه ذخیره سازی منابع را بر عهده دارد.

ViewModel 

این کلاس به صورت یک پل ارتباطی بین UI و Repository عمل می کند و تمامی المنت هایی که در UI برای دیتابیس مورد استفاده قرار می گیرند را به راحتی مورد استفاده قرار می گیرند.

LiveData 

لایو دیتا به وسیله observed، تمام دیتا را در اخرین state ذخیره می کند و در زمان تغییرات آن ها به سرعت و اتوماتیک آپدیت می شوند. این کامپونتت به خوبی از LifeCycle پشتیبانی می کند.

 

مشکلات عمده در استفاده از Sqlite

  • در زمان کامپایل هیچ بررسی بر روی کوئری‌ ها انجام نمی شود.
  • نوشتن کد زیاد و تکراری برای تبدیل کوئری به یک شیء جاوا 
  • وقت‌ گیر بودن و ایجاد خطا در زمان تغییر دادن دستی تمام query های دیتابیس

 

نحوه نصب Room persistence

مرحله اول: اضافه کردن Room

برای اضافه کردن Room باید وارد فایل build.gradle پروژه خود شید و maven repo گوگل را همانند کد زیر به پروژه خود اضافه نمایید.

allprojects {

repositories {

jcenter()

maven { url ‘https://maven.google.com’ }

}

}

 

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

در این مرحله باید وارد فایل build.gradle برنامه خود شوید و همانند کد زیر dependency ها را به فایل خود اضافه کنید.

implementation “android.arch.persistence.room:runtime:1.0.0-beta2”

annotationProcessor “android.arch.persistence.room:compiler:1.0.0-beta2”

 

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

برای تست کردن انتقال دیتابیس از Sqlite به Room به dependency زیر نیز نیاز دارید.

testImplementation “android.arch.persistence.room:testing:1.0.0-beta2”

راه اندازی یک پروژه جدید با Room

مرحله اول: اضافه کردن کد زیر در فایل build.gradle سطح اپ

dependencies {
def room_version = “2.2.5”

implementation “androidx.room:room-runtime:$room_version”
annotationProcessor “androidx.room:room-compiler:$room_version”

 

مرحله دوم: اضافه کردن ()google به بخش repositories در فایل build.gradle سطح پروژه 

repositories {

google()

jcenter()

}

 

ایجاد data access object) DAO)

شما طبق توضیحات مربوط به DAO و کد زیر می توانید یک interface) DAO) ساده با عملگر CRUD در Contact ایجاد و اضافه نمایید.

Dao

public interface ContactDAO {

@Insert

public void insert(Contact… contacts);

@Update

public void update(Contact… contacts);

@Delete

public void delete(Contact contact);

}

 

در کد بالا از ۳ عملیات استفاده شده است که در زیر به معرفی آن ها می پردازیم.

عملیات اضافه کردن (Insert)

از عملیات Insert برای ایجاد یک عملیات درج یا اضافه کردن مورد استفاده قرار می گیرد. شما با این عملیات تنها می توانید متدی را تعریف کنید که Contact contacts را به عنوان یک پارامتر دریافت می کنید که به صورت Insert@ حاشیه نویسی می شود.

عملیات بروزرسانی (Update)

این عملیات نیز همانند عملیات اضافه کردن عمل می کند که تنها می توانید برای ایجاد یک عملیات بروزرسانی از آن استفاده کنید که Contact contacts را به عنوان یک پارامتر دریافت نمایید که با دستور Update@ حاشیه نویسی می شود.

عملیات پاک کردن (Delete)

از این عملیات برای ایجاد یک عملیات پاک کردن استفاده می شود که Contact contacts را به صورت یک پارامتر دریافت خواهید کد و می توانید با دستور Delete@ آن را حاشیه نویسی نمایید.

 

کلاس های دیتابیس Room

 

کلاس های دیتابیس روم | بی لرن

 

کلاس user

@Entity

public class User {

@PrimaryKey

public int uid;

@ColumnInfo(name = “first_name”)

public String firstName;

@ColumnInfo(name = “last_name”)

public String lastName;

}

 

کلاس userdao

@Dao

public interface UserDao {

@Query(“SELECT * FROM user”)

List<User> getAll();

@Query(“SELECT * FROM user WHERE uid IN (:userIds)”)

List<User> loadAllByIds(int[] userIds);

@Query(“SELECT * FROM user WHERE first_name LIKE :first AND ” +

“last_name LIKE :last LIMIT 1”)

User findByName(String first, String last);

@Insert

void insertAll(User… users);

@Delete

void delete(User user);

}

 

کلاس AppDatabase

@Database(entities = {User.class}, version = 1)

public abstract class AppDatabase extends RoomDatabase {

public abstract UserDao userDao();

}

 

استفاده از کتابخانه Paging و پایگاه داده Room در اپلیکیشن های اندروید

کتابخانه Paging چیست؟

کتابخانه Paging یکی دیگر از کتابخانه ‌های اضافه شده به کامپوننت ‌های معماری اندروید می باشد که در موضوعاتی همچون مدیریت مؤثر بارگذاری و نمایش مجموعه داده ‌های بزرگ در RecyclerView مورد استفاده قرار می گیرد.

دلیل استفاده از کتابخانه Paging

  • فراخوانی نکردن داده ‌های بدون نیاز
  • صرفه‌ جویی در مصرف باتری و پهنای باند کاربر
  • بازیابی همه داده‌ های مورد نیاز در زمان کار با حجم کم

مراحل استفاده از کتابخانه Paging و پایگاه داده Room

مرحله اول: ایجاد یک پروژه اندروید در استودیو

در این مرحله باید انروید اندروید استودیو نسخه ۳ را دانلود و پس از نصب آن، برنامه را باز نمایید. سپس یک پروژه جدید با اکتیویتی خالی به نام MainActivity بسازید و گزینه Include Kotlin support را همانند تصویر زیر انتخاب کنید.

مرحله دوم: افزودن کامپوننت‌ های معماری 

کد زیر را در بخش build.gradle پروژه خود اضافه کنید.

dependencies {

implementation fileTree(dir: ‘libs’, include: [‘*.jar’])

implementation “android.arch.persistence.room:runtime:1.1.1”

kapt “android.arch.persistence.room:compiler:1.1.1”

implementation “android.arch.paging:runtime:1.0.1”

implementation “com.android.support:recyclerview-v7:27.1.1”

}

 

مرحله سوم: ایجاد یک موجودیت (Entity)

در این مرحله باید یک کلاس داده جدید کاتلین به نام Person ایجاد نمایید که در ساده ‌سازی امور مورد استفاده قرار می گیرد و دارای ۲ فیلد یک ID یکتا (id) و نام شخص (name) است. برای این کار باید از یک متد به نام  ()toString استفادع نمایید تا مقدار name را نمایش دهد.

import android.arch.persistence.room.Entity
import android.arch.persistence.room.PrimaryKey

@Entity(tableName = “persons”)

data class Person(

@PrimaryKey val id: String,

val name: String

) {

override fun toString() = name

}

 

مرحله چهارم: ایجاد ADO

طبق کد زیر می توانید یک ADO را ایجاد کنید.

import android.arch.lifecycle.LiveData
import android.arch.paging.DataSource
import android.arch.persistence.room.Dao
import android.arch.persistence.room.Delete
import android.arch.persistence.room.Insert
import android.arch.persistence.room.Query

@Dao

interface PersonDao {

@Query(“SELECT * FROM persons”)

fun getAll(): LiveData<List>

@Query(“SELECT * FROM persons”)

fun getAllPaged(): DataSource.Factory<Int, Person>

@Insert

fun insertAll(persons: List)

@Delete

fun delete(person: Person)

}

 

 

سخن پایانی

room یکی از ابزار های کاربردی دیتابیس SQLite می باشد که دارای نکات کاربردی همچون کامپوننت های اصلی، کلاس های Room، راه اندازی یک پروژه جدید با Room،  نحوه پیاده سازی Room در سورس اندروید و … می باشد که با یادگیری آن ها کار بار Room برای شما راحت و جذاب می شود. در صورتی که با مفاهیم دیتابیس و انواع آن ها آشناییت نداریت، بهتر است قبل از کار با Room با مفاهیم دیتابیس، دیتابیس SQLite و دیگر دیتابیس ها آشنا شوید.

برای دریافت پاسخ سوالات خود و بهره مند شدن از تجربه اساتید خبره و دیگر دوستانتان در کمپین آموزشی بی لرن می توانید سوالات خود را در کافه گپ و گفت مطرح نمایید و در سریعترین زمان، پاسخ سوال خود را دریافت نمایید. همچنین می توانید با عضویت در کمپین آموزشی بی لرن، از دوره های آموزشی رایگان و کاربردی در زمینه های مختلف به صورت تخصصی و حرفه ای بهره مند شوید. با توجه به مسیر یادگیری در زمینه های مختلف می توانید برای شروع طراحی سایت از آموزش MySQL بهره مند شوید.