استفاده از 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 از سه بخش اصلی تشکیل شده:EntityDaoDatabaseEntity: فرض کنید کلاسی به اسم 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 از قبل تعریف شده و فقط لازمه انوتیشن مربوطه به متدی که این کار ها را انجام میدهد اضافه کنید. @Deointerface 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();میتونید اطلاغات بیشتری از اینجا و اینجا بدست بیارید.راستش خودم همین امروز باهاش اشنا شدم پس اگه جایی اشتباه کردم حتما بهم بگید.