ویرگول
ورودثبت نام
Noah
Noah
خواندن ۵ دقیقه·۵ سال پیش

استفاده از Room به جای SQLite dbدر اندروید


** برای استفاده از این مقاله نیمه اموزشی باید با مفاهیم sqlite اشنا باشید و من فرض کردم اصل مطلب رو زود میگیرید و زیاد توضیح اضافی ندادم. البته برای شروع یکم گیج شدن خوبه:)

جت پک(jet pack) که از سال ۲۰۱۸ کار خود را اغاز کرد مجموعه ای از کتابخونه هاست که کمک میکنه سریعتر و اسانتر کد بزنیم. room یکی از اجزای جت پک هست که با استفاده از اون میتونیم خیلی راحت تر و سریع تر از sqlite داده های خودمون رو ذخیره و مدیریت کنیم.

در واقع room یک لایه انتزاعی یا abstraction layer روی sqlite هست که با استفاده از اون میتونیم به امکانات sqlite بهتر و سریعتر دسترسی داشته باشیم. یعنی خیلی از کار هایی که مجبور بودیم به صورت دستی در sqlite انجام بدیم در Room از قبل تاریف شده و ما فقط استفاده میکنیم. مثلا اضافه اپدیت یه حذف یا اضافه کردن یک ردیف(row). البته sqlite و room چیز های جدا از هم نیستند. ‌room فقط اجاره میده از امکانات sqlite اسونتر استفاره کنیم.

مزیت های Room نسبت به sqlite:

  • کوءری ها در زمان کامپایل چک میشوند نه در زمان اجرا . اگر query ما مشکلی داشته باشه مثلا دریفی اضافه کرده باشیم که وجود ندارد در زمان کامپایل چک میشوند و اکه اشکالی داشت به ما اخطار میده.
  • نیازی به نوشتن خیلی از کد های اضافی نیست.
  • در sqlite هر وقت الگو schema تغییر میکرد مجبور بودیم هرجا که از دیتابیس استفاده کردیم رو تغییر بدیم - باید query ها رو اپدیت میکردیم و ... . ولی در room db نیازی به این کار ها نیست.

چطور از room db استفاده کنیم؟

room db از سه بخش اصلی تشکیل شده:

  • Entity
  • Dao
  • Database


Entity:

فرض کنید کلاسی به اسم user داریم که میخوایم اطلاعات کاربران رو توش ‌ذخیره کنیم. این کلاس فیلد هایی مثل نام . نام خانوادگی و id داره که قراره توی یک sqlite db ذخیره بشه. خب اگه بخوایم اصولی پیش بریم اول باید اسم ستون ها و اسم جدول و ... رو توی کلاسی جدا به صورت مقدار های ثابت ذخیره کنیم که بعدا از اون استفاده کنیم. و بعد باید کلاسی میساختیم که از SQLiteOpenHelper ارث بری کنه و توش جدولمون رو بسازیم و ...

ولی دیگه نیازی به این مسخره بازی ها نداریم. فرض کنید این کلاس User هست:

public class User { String FirstName; String LastName; long id; public User(String firstName, String lastName) { FirstName = firstName; LastName = lastName; this.id = id; } // getters and setters }

برای انجام همه مراحل بالا با استفاده از room کافیه چند تا annotation اضافه کنیم.

به کلاسی که به عنوان مدل استفاده میکنیم باید @Entitiy اضافه کنیم . room به ازای هر کلاسی که این انوتیشن را داشته باشد جدولی با نام کلاس ایجاد میکنه که ستون هاش همون فیلد های کلاس یعنی first name , last name, و id هستند. دیدین!! نیازی به ساخت جدول به صورت دستی نیست. فقط یک نکته مهم وجود داره و اونم اینه که هر کدوم از این جور کلاس ها باید یکی از فیلد هاش با انوتیشن @PrimaryKey مشخص بشه.(حتما میدونید primary key یعنی چی).

البته به این خشکی هم نیست . میتونیم اسم جدول رو به عنوان پارامتر @entity مشخص کنیم. یا اسم ستون ها رو با پارامتر @ColumnInfo مشخص کنیم. مثلا میخوایم اسم جدولمون users باشه و اسم ستون ها first_name, last_name و id_ باشه:

import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.PrimaryKey; @Entity(tableName = &quotusers&quot) public class User { @ColumnInfo(name = &quotfirst_name&quot) String FirstName; @ColumnInfo(name = &quotlast_name&quot) String LastName; @PrimaryKey @ColumnInfo(name = &quot_id&quot) long id; public User(String firstName, String lastName) { FirstName = firstName; LastName = lastName; this.id = id; } // getters and setters }

Doa:

همون کار cursor یعنی دسترسی به اطلاعات رو انجام میده (مخفف data access object). مثل اضافه کردن و دریافت اطلاات از جدول. برای ساخت deo باید یک کلاس abstract یا یک اینترفیس ایجاد کنیم که با انوتیشن @Deo مشخص شده. بعد باید متد هایی که لازم داریم رو بسازیم. مثلا متدی که یک ردیف ر اضافه میکند:

@Insert void insertUser(User user);

سه تا عمل اصلی insert , update , و delete از قبل تعریف شده و فقط لازمه انوتیشن مربوطه به متدی که این کار ها را انجام میدهد اضافه کنید.

@Deo
interface MyDeo{ @Insert void insertUser(User user); @Update void updateUser(User user); @Delete void deleteUser(User user); }

ولی اگه بخوایم query خاصی رو انجام بدیم باید از @Query استفاده کنیم. و query مربوطه رو به عنوان پارامتر بهش بدیم.مثلا:

@Query(&quotSELECT * FROM users&quot) List<User> getUsers;

Database:

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

اول باید کلاسی بسازیم که از RoomDatabase ارث بری میکنه و باید با انوتیشن @Database مشخص بشه و اسم کلاس های مدل ( همون entity هایی که ساختیم) و ورژن دیتابیس رو به عنوان پارامتر بهش بدیم . و حتما باید متدی داشته باشه که یه شی از کلاس doa ای که ساختین برگردونه.

@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase {     public abstract UserDao userDao(); }

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

AppDatabase db = Room.databaseBuilder(getApplicationContext(),         AppDatabase.class, &quotdatabase-name&quot).build();

میتونید اطلاغات بیشتری از اینجا و اینجا بدست بیارید.

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

اندرویدandroidjetpackroom
علاقه مند به برنامه نویسی اندروید, پایتون و هر چیزی که مربوط به کامپیوتر باشه.
شاید از این پست‌ها خوشتان بیاید