آموزش کامل کار با کتابخانه Room (بخش اول)
جلسات دوره
مهدی عباسی
مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه
آموزش کامل کار با کتابخانه Room (بخش اول)
در این جلسه میخواهیم به آموزش کامل کار با کتابخانه Room که برای کار کردن با دیتابیس لوکال استفاده میشود، آشنا شویم. در جلسات گذشته با استفاده از کلاسهای پیش فرض اندروید با دیتابیس SQLite کار کردیم. با استفاده از کتابخانه Room با سرعت و کیفیت بیشتر و خطای کمتر، با دیتابیس ارتباط برقرار میکنیم و عملیات مدنظر را انجام میدهیم.
کتابخانه Room متعلق به شرکت گوگل میباشد و میتواند عملیات ارتباط با دیتابیس را سریعتر و با کیفیت بیشتر انجام دهد. برای اضافه کردن کتابخانه Room کد زیر را درون قسمت dependencies در فایل build.gradle قرار دهید و پروژه را Sync Now کنید.
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
بعد از اضافه شدن کتابخانه Room به سراغ ساخت کلاس مدل میرویم. در این جلسه میخواهیم کلاس مدل Person را پیادهسازی کنیم که فیلدهای آن شامل: personId ،name ،family ،age ،avg میباشد.
public class Person {
private int personId;
private String name;
private String family;
private int age;
private float avg;
public Person(int personId, String name, String family, int age, float avg) {
this.personId=personId;
this.name=name;
this.family=family;
this.age=age;
this.avg=avg;
}
public Person() {
}
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId=personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public String getFamily() {
return family;
}
public void setFamily(String family) {
this.family=family;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age=age;
}
public int getAvg() {
return avg;
}
public void setAvg(int avg) {
this.avg=avg;
}
}
در جلسات گذشته بعد از ساخت کلاس مدل، یک کلاس برای مدیریت دستورات SQL به کمک کلاس SQLiteOpenHelper ایجاد میکردیم که ساختار جدول بر اساس دستوارت SQL بود و درون آن کلاس را مینوشتیم. اما در این جلسه به کمک Annotationهای کتابخانه Room ساختار جدول را مشخص میکنیم.
برای ایجاد دیتابیس از @Entity که بالای نام کلاس قرار میگیرد و میتوان نام جدول را وارد کرد، استفاده میکنیم.
@Entity(tableName = "T_Person")
Public classs Person() { }
همچنین برای نام ستونهای جدول از @ColumnInfo که بالای هر فیلد کلاس قرار میگیرد، استفاده میکنیم.
@ColumnInfo(name = “PersonId”)
private int personId;
اگر از @ColumnInfo استفاده نکنید از نام متغییر برای نام ستون استفاده میکند. برای انتخاب کلید جدول از @PrimaryKey استفاده میکنیم. همچنین برای autoIncrement کردن کلید جدول مقدار autoGenarate را برابر true قرار میدهیم.
@ColumnInfo(name = “PersonId”)
@PrimaryKey(autoGenerate = true)
private int personId;
بعد از پیکربندی کلاس مدل، نیاز به Data Access Object(DAO) داریم که باید برای هر کلاس مدل، به صورت Interface نوشته شود و عملیاتهای لازم کلاس مدل را درون آن تعریف کنیم. بعد از ساخت Interface، عملیاتهای درج، حذف و ویرایش را با استفاده از Annotationهای کتابخانه Room تعریف میکنیم. با استفاده از @Insert بالای نام تابع میتوان عملیات درج را اضافه کرد. خروجی تابع درج، میتواند Void و همچنین عدد Long(شماره رکورد اضافه شده) باشد.
@Insert
Long add(Person person);
با استفاده از @Delete میتوان عملیات حذف از جدول دیتابیس را اضافه کرد. خروجی این تابع از نوع int است که تعداد رکوردهای حذف شده را برمی گرداند.
@Delete
int delete(Person person);
با استفاده از @Update میتوان عملیات ویرایش و بروزرسانی را اضافه کرد. خروجی این تابع از نوع int است که تعداد رکوردهای آپدیت شده را بر میگرداند.
@Update
int update(Person person);
برای واکشی اطلاعات (Select) از @Query استفاده میکنیم و دستورات SQL را درون آن مینویسیم. خروجی این تابع میتواند از هر نوع شی باشد.
@Query(“Select * From T_Person”)
List<Person> selectAll();
@Query(“Select * From T_Person where Family=:family”)
List<Person> searchByFamily();
@Query(“Select * From T_Person where Family Like ‘%’ || :s || ‘%’ ”)
List<Person> searchByLikeOnFamily(String s);
در بالا با استفاده از دستور Like در SQL یک عملیات سرچ نوشتیم که هر کاراکتر یا کلمهای که کاربر وارد کند، اگر درون یک کلمه وجود داشته باشد آن را برمی گرداند.
@Query(“Select *From T_Person where PersonId=:id”)
Person searchById(int id);
کدهای کلاس Person
@Entity(tableName = "T_Person")
public class Person {
@ColumnInfo(name = “PersonId”)
@PrimaryKey(autoGenerate = true)
private int personId;
@ColumnInfo(name = “Name”)
private String name;
@ColumnInfo(name = “Family”)
private String family;
@ColumnInfo(name = “Age”)
private int age;
@ColumnInfo(name = “Avg”)
private float avg;
public Person(int personId, String name, String family, int age, float avg) {
this.personId=personId;
this.name=name;
this.family=family;
this.age=age;
this.avg=avg;
}
public Person() {
}
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId=personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public String getFamily() {
return family;
}
public void setFamily(String family) {
this.family=family;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age=age;
}
public int getAvg() {
return avg;
}
public void setAvg(int avg) {
this.avg=avg;
}
}
کدهای PersonDao
Public interface PersonDao{
@Insert
Long add(Person person);
@Delete
int delete(Person person);
@Update
int update(Person person);
@Query(“Select * From T_Person”)
List<Person> selectAll();
@Query(“Select * From T_Person where Family=:family”)
List<Person> searchByFamily();
@Query(“Select * From T_Person where Family Like ‘%’ || :s || ‘%’ ”)
List<Person> searchByLikeOnFamily(String s);
@Query(“Select *From T_Person where PersonId=:id”)
Person searchById(int id);
}
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.