** برای استفاده از این مقاله نیمه اموزشی باید با مفاهیم sqlite اشنا باشید و من فرض کردم اصل مطلب رو زود میگیرید و زیاد توضیح اضافی ندادم. البته برای شروع یکم گیج شدن خوبه:)
جت پک(jet pack) که از سال ۲۰۱۸ کار خود را اغاز کرد مجموعه ای از کتابخونه هاست که کمک میکنه سریعتر و اسانتر کد بزنیم. room یکی از اجزای جت پک هست که با استفاده از اون میتونیم خیلی راحت تر و سریع تر از sqlite داده های خودمون رو ذخیره و مدیریت کنیم.
در واقع room یک لایه انتزاعی یا abstraction layer روی sqlite هست که با استفاده از اون میتونیم به امکانات sqlite بهتر و سریعتر دسترسی داشته باشیم. یعنی خیلی از کار هایی که مجبور بودیم به صورت دستی در sqlite انجام بدیم در Room از قبل تاریف شده و ما فقط استفاده میکنیم. مثلا اضافه اپدیت یه حذف یا اضافه کردن یک ردیف(row). البته sqlite و room چیز های جدا از هم نیستند. room فقط اجاره میده از امکانات sqlite اسونتر استفاره کنیم.
مزیت های Room نسبت به sqlite:
چطور از room db استفاده کنیم؟
room db از سه بخش اصلی تشکیل شده:
فرض کنید کلاسی به اسم 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 = "users") public class User { @ColumnInfo(name = "first_name") String FirstName; @ColumnInfo(name = "last_name") String LastName; @PrimaryKey @ColumnInfo(name = "_id") long id; public User(String firstName, String lastName) { FirstName = firstName; LastName = lastName; this.id = id; } // getters and setters }
همون کار 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("SELECT * FROM users") List<User> getUsers;
اینجا باید از اون دو تا کلاسی که ایجاد کردیم استفاده کنیم. درواقع اصل دیتابیس اینجا ساخته میشه.
اول باید کلاسی بسازیم که از 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, "database-name").build();
میتونید اطلاغات بیشتری از اینجا و اینجا بدست بیارید.
راستش خودم همین امروز باهاش اشنا شدم پس اگه جایی اشتباه کردم حتما بهم بگید.