به کارگیری از کتابخانه Paging با مقر داده Room در نرم افزار های اندرویدی – راهنمای جامع
درین راهنما به شما نماد میدهیم که چه طور از کتابخانه Paging تحت عنوان یکیاز کامپوننتهای معماری اندروید به همپا مقر داده با تامین Room در یک نرم افزار اندروید به کارگیری فرمایید. شما دراین نوشته ی علمی با طریق به کار گیری از کتابخانه Paging برای بار گذاری کارآمد گروه دادههای گران قدر از مقر داده حمایت گردیده به وسیله Room آشنا میشوید. براین اساس یوزرها نرم افزار شما هنگام اسکرول کردن یک RecyclerView تجربیات کاربری جاریتری را شاهد خواهند بود.
پیشنیازها
برای این که بتوانید از این راهنما استعمال فرمایید، می بایست آغاز موردها ذیل را مهیا کرده باشید:
ورژن 3.1.3 یا این که فراتر
پلاگین کاتلین Kotlin 1.2.51 یا این که فراتر
همینطور بایستی درکی مقدماتی از کامپوننتهای معماری اندروید (به خصوص LiveData و مقر داده Room داشته باشید)
کد نرم افزار معمولیای که درین نوشته ساختوساز می شود درین ریپو گیتهاب قرار گرفته میباشد و می توانید طراحی اپلیکیشن در مشهد کد را از آنجا نیز پیگیری فرمائید.
کلیک فرمائید
کتابخانه Paging به چه مضمون میباشد؟
کتابخانه Paging یکیاز کتابخانههای افزوده گردیده به کامپوننتهای معماری اندروید به حساب میآید. این کتابخانه به مدیر مؤثر لود و اکران تیم دادههای گران قدر در RecyclerView یاری مینماید. تمجید قانونی آن اینگونه میباشد:
کتابخانه Paging قابلیت و امکان بار گذاری تدریجی و جاری دادهها در RecyclerView نرم افزار را فراهم مینماید. در حالتی که هر قسمت از نرم افزار اندرویدی بخواهد دسته داده بزرگی را از منبع داده محلی یا این که ریموت اکران دهد، هر فرصت صرفا بخشی از آن را میقدرت اکران دهد. در اینحالت بایستی از کتابخانه Paging یاری بگیرید تا کوشش نرم افزار خویش را بهبود ببخشید.
چرا می بایست از کتابخانه Paging استفاده نمود؟
بعد از توضیحات مقدماتی فوق ممکن میباشد از خویش بپرسید، چرا بایستی از این کتابخانه به کار گرفت؟ پیرو بعضا دلایلی که چرا می بایست از آن برای بار گذاری گروه دادههای گران قدر در یک RecyclerView استعمال نمایید را توضیح دادهایم.
این کتابخانه، دادههایی را که مورد نیاز ندارد، درخواست نمینماید، یعنی این کتابخانه فقط دادههایی را میخواهد که هنگام اسکرول کردن استفاده کننده، در روءیت کرد او قرار میگیرند.
سبب صرفهجویی در مصرف باتری و پهنای باند استفاده کننده میگردد. از آنجا این کتابخانه فقط دادههای آیتم تقاضا را اکران می دهد منجر صرفهجویی در منابع موبایل موبایل میگردد.
بازیابی تمامی دادههای موردنیاز در حین شغل با وسعت بالایی از دادهها خط مش چندان کارآمدی به اکانت نمیآید زیرا فقط زیرمجموعه کوچکی از آن هر مجال به استفاده کننده اکران داده می گردد. در اینگونه موقعیتی بایستی به مکان آن از شیتبندی (paging) به کارگیری کنیم.
1. ساخت و ساز یک پروژه اندروید استودیو
اندروید استودیو ورژن 3 خویش را گشوده نمائید و یک پروژه تازه با اکتیویتی خالی به اسم MainActivity ساختوساز فرمائید. مطمئن گردید که مورد Include Kotlin support را گزینش کردهاید.
2. اضافه کردن کامپوننتهای معماری
بعد از ساخت و ساز یک پروژه نو، تعلقهای تحت را به قسمت build.gradle پروژه خویش اضافه فرمائید.
کلیک نمایید
دراین راهنما ما از واپسین ورژن (تا فرصت کتابت این نوشتهیعلمی) از کتابخانه Paging و ورژن 1.1.1 Room به کار گیری میکنیم.
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"
}
این اجزا در ریپازیتوری Maven گوگل جان دار می باشند.
allprojects {
repositories {
google()
jcenter()
}
}
با اضافه کردن این تعلقها به Gradle می گوییم که به چه شکل کتابخانه را پیدا نماید. مطمئن گردید که بعداز اضافه کردن مفاد فوق، پروژه خویش را sync می کنید.
3. ساختوساز یک موجودیت (Entity)
یک کلاس داده تازه کاتلین به اسم Person ساختوساز فرمایید. به مراد بی آلایشسازی کارها، موجودیت 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
}
4. تولید ADO
همانگونه که می دانید برای این که بتوانیم از کتابخانه Room به کارگیری کنیم، آغاز می بایست «اشیای دسترسی داده» (DAO) را در چنگ داشته باشیم. در این زمینه ما یک DAO به اسم PersonDao ساختوساز می کنیم.
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
@Query("SELECT * FROM persons")
fun getAllPaged(): DataSource.Factory
@Insert
fun insertAll(persons: List)
@Delete
fun delete(person: Person)
}
در کلاس PersonDao دو روال Query@ داریم. یک کدام از آنها به اسم ()getAll میباشد که مقدار LiveDateیی که فهرستی از اشیای Person را دارااست گشوده میگرداند. دیگری سیاق ()getAllPaged میباشد که یک DataSource.Factory گشوده میگرداند. بر طبق مستندات قانونی، کلاس DataSource یک کلاس مبنا برای بار گذاری شیتهایی از دادههای تعیین گردیده باطن یک PagedList میباشد.
خواسته از PagedList نوع خاصی از List میباشد که دادههای کاغذبندی گردیده را در اندروید اکران می دهد. در واقع یک PagedList لیستی میباشد که دادههایش را در گروههایی (شیت) از یک DataSource لود مینماید. این مفاد با اسلوب (get(int قابل دسترس میباشند و بار گذاری مفاد دیگر با استعمال از سیاق (loadAroud(int میسر میباشد.
ما روال استاتیک Factory در کلاس DataSource را فراخوانی میکنیم که تحت عنوان یک سوله (برای ساختوساز شی ءها، سوای در چنگ داشتن کلاس ظریف) برای DataSource شغل مینماید. این سیاق استاتیک دو نوع داده میپذیرد:
کلیدی که گزینههای جانور در DataSource را میپذیرد. اعتنا داشته باشید که برای یک کوئری Room، شیتها شمارهگذاری گردیدهاند و از این رو بایستی از Integer تحت عنوان نوع شناسه شیت به کارگیری فرمایید. قابلیت داشتن برگههای «کلیددار» با استعمال از کتابخانه Paging وجود داراست؛ البته Room آن را فعلا ارائه نمینماید.
نوعی از موردها یا این که موجودیتها (POJO ها) که در فهرست بوسیله DataSource ها بار گذاری می شوند.
5. ساخت مقر داده
کلاس مقر داده Room چیزی مشابه پایین میباشد:
import android.arch.persistence.db.SupportSQLiteDatabase
import android.arch.persistence.room.Database
import android.arch.persistence.room.Room
import android.arch.persistence.room.RoomDatabase
import android.content.Context
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import com.chikeandroid.pagingtutsplus.utils.DATABASE_NAME
import com.chikeandroid.pagingtutsplus.workers.SeedDatabaseWorker
@Database(entities = [Person::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun personDao(): PersonDao
companion object {
// For Singleton instantiation
@Volatile private var instance: AppDatabase? = null
fun getInstance(context: Context): AppDatabase {
return instance ?: synchronized(this) {
instance
?: buildDatabase(context).also { instance = it }
}
}
private fun buildDatabase(context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
val request = OneTimeWorkRequestBuilder().build()
WorkManager.getInstance()?.enqueue(request)
}
})
.build()
}
}
}
دراین مکان ما یک نوبت منفرد از مقر داده خویش ساخت و ساز کردهایم و آن را با دادههایی که از API WorkManager استعمال مینمایند، از گذشته مقداردهی کردهایم. اعتنا داشته باشید که دادههایی که از گذشته مقداردهی گردیدهاند صرفا لیستی از 1000 اسم را مشمول می گردند. (برای پژوهش بیشتر به کد مثالای که ارائه شدهاست رجوع نمایید)
6. ساخت ViewModel
برای این که UI ما بتواند دادهها را به روشی مطلع از چرخه قدمت (lifecycle-conscious) ذخیره، مشاهده و عرضه بکند بایستی یک ViewModel داشته باشیم. PersonsViewModel ما که کلاس AndroidViewModel را توسعه و گسترش می دهد قرار میباشد تحت عنوان ViewModel ما شغل نماید.
import android.app.Application
import android.arch.lifecycle.AndroidViewModel
import android.arch.lifecycle.LiveData
import android.arch.paging.DataSource
import android.arch.paging.LivePagedListBuilder
import android.arch.paging.PagedList
import com.chikeandroid.pagingtutsplus.data.AppDatabase
import com.chikeandroid.pagingtutsplus.data.Person
class PersonsViewModel constructor(application: Application)
: AndroidViewModel(application) {
private var personsLiveData: LiveData
init {
val factory: DataSource.Factory =
AppDatabase.getInstance(getApplication()).personDao().getAllPaged()
val pagedListBuilder: LivePagedListBuilder = LivePagedListBuilder(factory,
50)
personsLiveData = pagedListBuilder.build()
}
fun getPersonsLiveData() = personsLiveData
}
دراین کلاس یک فیلد منفرد به اسم personsLiveData داریم. این فیلد تنهاً LiveData یی میباشد که یک PagedList از اشیای Person محافظت مینماید. به جهت وجود همین LiveData میباشد که UI (یعنی اکتیویتی یا این که فرگمنت) ما بایستی این دادهها را با فراخوانی اسلوب getter برای ()getPersonsLiveData مشاهده نماید.
ما personsLiveData را باطن بلوک init مقداردهی نخستین کردهایم. دراین بلوک DataSource.Factory را با فراخوانی سینگلتون AppDatabase برای شیء PersonDao اخذ میکنیم. هنگامی این شیء را به دست آوردیم، روال getAllPaged() را فراخوانی میکنیم.
آن گاه یک LivePagedListBuilder ساخت و ساز می کنیم. مستندات قانونی راجعبه آن اینگونه توضیح دادهاند:
LivePagedListBuilder با فرض وجود LiveData و یک DataSource.Factory برای ایجاد کرد PagedList.Config به کار گیری می گردد.
ما به مشی خالق آن DataSource.Factory را تحت عنوان اول آرگومان و اندازه ورقه را تحت عنوان دومین آرگومان ارسال می کنیم (دراین نمونه اندازه برگه 50 خواهد بود). به صورت معمول می بایست اندازهای تعیین نمایید که از بیشینه چند که هر توشه برای مخاطب اکران خواهید اعطا کرد بیشتر باشد. در غایت اسلوب build() را فراخوانی می کنیم تا این بنا را بسازد و به طور یک LiveData برای ما بازگرداند.