مكونات وإعتبارات بيانات مكتبة الترحيل

الإعلانات

 

مكونات وإعتبارات بيانات مكتبة الترحيل

 

 

 

مكونات وإعتبارات بيانات مكتبة الترحيل

يستند هذا الدليل إلى نظرة عامة على مكتبة الترحيل، ويناقش كيفية تخصيص، حل تحميل بيانات تطبيقك، لتلبية إحتياجات بنية التطبيق.

 

 

 

بناء قائمة قابلة للمراقبه


عادةً، كود واجهة المستخدم الخاصة بك، يراقب كائن <LiveData<PagedList (أو إذا كنت تستخدم RxJava2 أو كائن قابل للتدفق..

<Flowable<PagedList أو كائن قابل للمراقبه <Observable<PagedList)، والذي يتواجد في ViewModel الخاصة بتطبيقك.

يشكل هذا الكائن القابل للمراقبة، صلة وصل بين العرض التقديمي، ومحتويات بيانات قائمة التطبيق.

لإنشاء أحد هذه الكائنات PagedList القابلة للمراقبه، قم بتمرير مثيل DataSource.Factory إلى كائن LivePagedListBuilder أو RxPagedListBuilder.

يقوم كائن DataSource بتحميل صفحات لـ PagedList واحده. تقوم فئة المصنع بإنشاء نسخ جديدة من PagedList إستجابةً لتحديثات المحتوى..

مثل عمليات إلغاء جداول قاعدة البيانات، وتحديثات الشبكة. يمكن لمكتبة ثبات الروم توفير كائنات DataSource.Factory لك، أو يمكنك بناء الكائنات الخاصة بك.

يعرض مقتطف الكود التالي، كيفية إنشاء مثيل جديد من <LiveData<PagedList في فئة ViewModel لتطبيقك..

بإستخدام إمكانات بناء DataSource.Factory للروم:

ConcertDao

KOTLIN

@Dao
interface ConcertDao {
    // The Int type parameter tells Room to use a PositionalDataSource
    // object, with position-based loading under the hood.
    @Query("SELECT * FROM concerts ORDER BY date DESC")
    fun concertsByDate(): DataSource.Factory<Int> concertsByDate()
}

JAVA

@Dao
public interface ConcertDao {
    // The Integer type parameter tells Room to use a PositionalDataSource
    // object, with position-based loading under the hood.
    @Query("SELECT * FROM concerts ORDER BY date DESC")
    DataSource.Factory<Integer, Concert> concertsByDate();
}

 

 

ConcertViewModel

KOTLIN

// The Int type argument corresponds to a PositionalDataSource object.
val myConcertDataSource : DataSource.Factory<Int, Concert> =
       concertDao.concertsByDate()

val concertList = LivePagedListBuilder(
    myConcertDataSource, /* page size */ 20).build()

JAVA

// The Integer type argument corresponds to a PositionalDataSource object.
DataSource.Factory<Integer, Concert> myConcertDataSource =
       concertDao.concertsByDate();

LiveData<PagedList<Concert>> concertList =
        LivePagedListBuilder(myConcertDataSource, /* page size */ 20).build()

 

 

 

 

مكونات وإعتبارات بيانات مكتبة الترحيل

 

حدد تكوينات الترحيل الخاصة بك


لتكوين <LiveData<PagedList بشكلٍ أكبر للحالات المتقدمة، يمكنك أيضاً تحديد تكوينات الترحيل الخاصة بك. على وجه الخصوص، يمكنك تحديد السمات التالية:

  •  حجم الصفحة: عدد العناصر في كل صفحة.

 

  •  الجلب المسبق للمسافه: نظراً لظهور آخر عنصر مرئي في واجهة مستخدم التطبيق..

يجب على مكتبة الترحيل أن تحاول جلب عدد العناصر الموجودة خارج هذا العنصر الأخير، مقدماً.
يجب أن تكون هذه القيمة أكبر عدة مرات من حجم الصفحة.

 

  • وجود عنصر نائب: لتحديد ما إذا كانت واجهة المستخدم، تعرض عناصر نائبة، لعناصر القائمة التي لم يكتمل تحميلها بعد.

لإجراء مناقشة حول مزايا وعيوب إستخدام العناصر النائبة، تعلم كيفية توفير عناصر نائبة في واجهة المستخدم.

إذا كنت ترغب في مزيد من التحكم، في وقت قيام مكتبة الترحيل بالتحميل، من قائمة قاعدة بيانات التطبيق..

قم بتمرير كائن Executor مخصص إلى LivePagedListBuilder، كما هو موضح في مقتطف الكود التالي:

ConcertViewModel
KOTLIN

val myPagingConfig = PagedList.Config.Builder()
        .setPageSize(50)
        .setPrefetchDistance(150)
        .setEnablePlaceholders(true)
        .build()

// The Int type argument corresponds to a PositionalDataSource object.
val myConcertDataSource : DataSource.Factory<Int, Concert> =
        concertDao.concertsByDate()

val concertList = LivePagedListBuilder(myConcertDataSource, myPagingConfig)
        .setFetchExecutor(myExecutor)
        .build()

JAVA

PagedList.Config myPagingConfig = new PagedList.Config.Builder()
        .setPageSize(50)
        .setPrefetchDistance(150)
        .setEnablePlaceholders(true)
        .build();

// The Integer type argument corresponds to a PositionalDataSource object.
DataSource.Factory<Integer, Concert> myConcertDataSource =
        concertDao.concertsByDate();

LiveData<PagedList<Concert>> concertList =
        new LivePagedListBuilder<>(myConcertDataSource, myPagingConfig)
            .setFetchExecutor(myExecutor)
            .build();

 

 

 

 

 

إختيار نوع مصدر البيانات الصحيح


من المهم الإتصال بمصدر البيانات، الذي يتعامل بشكلٍ أفضل مع بنية بيانات المصدر:

  • إستخدم PageKeyedDataSource إذا كانت الصفحات التي تقوم بتحميلها تحتوي على المفاتيح التالي/السابق.

مثال، إذا كنت تقوم بجلب مشاركات الشبكات الإجتماعية من الشبكة، فقد تحتاج إلى تمرير رمز الصفحة التالية nextPage من محمل إلى محمل لاحق.

 

  • إستخدم ItemKeyedDataSource إذا كنت بحاجة إلى إستخدام البيانات من العنصر N لجلب البيانات من العنصر N + 1.

على سبيل المثال، إذا كنت تقوم بجلب تعليقات موضوع لتطبيق مناقشة، فقد تحتاج إلى تمرير المعرف الخاص بآخر تعليق للحصول على محتويات التعليق التالي.

 

  • إستخدم PositionalDataSource إذا كنت بحاجة إلى جلب صفحات البيانات من أي مكان تختاره في مخزن البيانات.

هذه الفئة تدعم طلب مجموعة من عناصر البيانات، بدءاً من أي موقع تختاره. على سبيل المثال، قد يقوم الطلب بإرجاع عناصر البيانات العشرين بدءاً من الموقع 1200.

 

 

 

 

مكونات وإعتبارات بيانات مكتبة الترحيل

 

 

الإبلاغ عندما تكون البيانات غير صالحة


عند إستخدام مكتبة الترحيل، فإن القرار يعود لطبقة البيانات data layer لإعلام الطبقات الأخرى، في تطبيقك عندما يصبح الجدول أو الصف تالف.

للقيام بذلك، قم بإستدعاء ()invalidate من فئة DataSource التي أخترتها لتطبيقك.

 

ملاحظة: يمكن أن تؤدي واجهة مستخدم تطبيقك إلى تشغيل وظيفة إلغاء البيانات هذه بإستخدام التمرير لتحديث النموذج.

 

 

 

 

 

بناء مصادر البيانات الخاصة بك


إذا كنت تستخدم حل بيانات محلية مخصصه، أو إذا قمت بتحميل البيانات مباشرة من شبكة، فيمكنك تنفيذ..

إحدى مجموعات البيانات الفرعية لمصدر البيانات DataSource. يعرض مقتطف الكود التالي مصدر بيانات مرتبط بوقت بدء حفلة موسيقية معينة:

KOTILN

class ConcertTimeDataSource() :
        ItemKeyedDataSource<Date, Concert>() {
    override fun getKey(item: Concert) = item.startTime

    override fun loadInitial(
            params: LoadInitialParams<Date>,
            callback: LoadInitialCallback<Concert>) {
        val items = fetchItems(params.key, params.requestedLoadSize)
        callback.onResult(items)
    }

    override fun loadAfter(
            params: LoadParams<Date>,
            callback: LoadCallback<Concert>) {
        val items = fetchItemsAfter(
            date = params.key,
            limit = params.requestedLoadSize)
        callback.onResult(items)
    }
}

JAVA

public class ConcertTimeDataSource
        extends ItemKeyedDataSource<Date, Concert> {
    @NonNull
    @Override
    public Date getKey(@NonNull Concert item) {
        return item.getStartTime();
    }

    @Override
    public void loadInitial(@NonNull LoadInitialParams<Date> params,
            @NonNull LoadInitialCallback<Concert> callback) {
        List<Concert> items =
            fetchItems(params.key, params.requestedLoadSize);
        callback.onResult(items);
    }

    @Override
    public void loadAfter(@NonNull LoadParams<Date> params,
            @NonNull LoadCallback<Concert> callback) {
        List<Concert> items =
            fetchItemsAfter(params.key, params.requestedLoadSize);
        callback.onResult(items);
    }

 

يمكنك بعد ذلك تحميل هذه البيانات المخصصة، إلى كائنات PagedList عن طريق إنشاء فئة فرعية محددة من DataSource.Factory.

يعرض مقتطف الكود التالي، كيفية إنشاء مثيلات جديدة، لمصدر البيانات المخصصة المعرفة في مقتطف الكود السابق:

KOTLIN

class ConcertTimeDataSourceFactory() :
        DataSource.Factory<Date, Concert>() {
    val sourceLiveData = MutableLiveData<ConcertTimeDataSource>()
    override fun create(): DataSource<Date, Concert> {
        val source = ConcertTimeDataSource()
        sourceLiveData.postValue(source)
        return source
    }
}

JAVA

public class ConcertTimeDataSourceFactory
        extends DataSource.Factory<Date, Concert> {
    private MutableLiveData<ConcertTimeDataSource> mSourceLiveData =
            new MutableLiveData<>();

    @Override
    public DataSource<Date, Concert> create() {
        ConcertTimeDataSource source =
            new ConcertTimeDataSource();
        mSourceLiveData.postValue(source);
        return source;
    }
}

 

 

 

 

 

ضع في إعتبارك كيفية عمل تحديثات المحتوى


عند إنشاء كائنات PagedList قابلة للمراقبه، فكّر في كيفية عمل تحديثات المحتوى. إذا كنت تحمِّل البيانات مباشرةً..

من قاعدة بيانات الروم، فسيتم دفع التحديثات تلقائياً، إلى واجهة مستخدم تطبيقك.

إذا كنت تستخدم واجهة برمجة تطبيقات شبكة التقسيم، فغالباً ما سيكون تفاعل المستخدم، مثل “التمرير للتحديث”..

بمثابة إشارة لإبطال مصدر البيانات الحالي، وطلب مصدر جديد. يظهر هذا السلوك في مقتطف الكود التالي:

KOTLIN

class ConcertActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // ...
        concertTimeViewModel.refreshState.observe(this, Observer {
            // Shows one possible way of triggering a refresh operation.
            swipeRefreshLayout.isRefreshing =
                    it == MyNetworkState.LOADING
        })
        swipeRefreshLayout.setOnRefreshListener {
            concertTimeViewModel.invalidateDataSource()
        }
    }
}

class ConcertTimeViewModel(firstConcertStartTime: Date) : ViewModel() {
    val dataSourceFactory = ConcertTimeDataSourceFactory(firstConcertStartTime)
    val concertTimeDataSource = dataSourceFactory.create()
    val concertList: LiveData<PagedList<Concert>> =
            LivePagedListBuilder(dataSourceFactory, 20)
                .setFetchExecutor(myExecutor)
                .build()

    fun invalidateDataSource() = concertTimeDataSource.invalidate()
}

JAVA

public class ConcertActivity extends AppCompatActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        // ...
        mViewModel.getRefreshState()
                .observe(this, new Observer<NetworkState>() {
            // Shows one possible way of triggering a refresh operation.
            @Override
            public void onChanged(@Nullable MyNetworkState networkState) {
                swipeRefreshLayout.isRefreshing =
                        networkState == MyNetworkState.LOADING;
            }
        };

        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshListener() {
            @Override
            public void onRefresh() {
                mViewModel.invalidateDataSource();
            }
        });
    }
}

public class ConcertTimeViewModel extends ViewModel {
    private LiveData<PagedList<Concert>> mConcertList;
    private DataSource<Date, Concert> mConcertTimeDataSource;

    public ConcertTimeViewModel(Date firstConcertStartTime) {
        ConcertTimeDataSourceFactory dataSourceFactory =
                new ConcertTimeDataSourceFactory(firstConcertStartTime);
        mConcertTimeDataSource = dataSourceFactory.create();
        mConcertList = new LivePagedListBuilder<>(dataSourceFactory, 20)
                .setFetchExecutor(myExecutor)
                .build();
    }

    public void invalidateDataSource() {
        mConcertTimeDataSource.invalidate();
    }
}

 

 

 

 

توفير التعيين بين بيانات التمثيل


تدعم مكتبة الترحيل التحويلات، المستندة إلى العناصر والمستندة، إلى التصفح للعناصر التي تم تحميلها بواسطة DataSource.

في مقتطف الكود التالي، يتم تعيين مجموعة من: اسم الحفلة الموسيقية، تاريخ الحفل، إلى سلسلة مفرده تحتوي على الأسم والتاريخ:

KOTLIN

class ConcertViewModel : ViewModel() {
    val concertDescriptions : LiveData<PagedList<String>>
        init {
            val factory = database.allConcertsFactory()
                    .map { concert ->
                           concert.name + " - " + concert.date
                    }
            concerts = LivePagedListBuilder(factory, /* page size */ 30).build()
        }
    }
}

JAVA

public class ConcertViewModel extends ViewModel {
    private LiveData<PagedList<String>> mConcertDescriptions;

    public ConcertViewModel(MyDatabase database) {
        DataSource.Factory<Integer, Concert> factory =
                database.allConcertsFactory().map(concert ->
                    concert.getName() + "-" + concert.getDate());
        mConcertDescriptions = new LivePagedListBuilder<>(
            factory, /* page size */ 30).build();
    }
}

 

 

يمكن أن يكون هذا مفيداً، إذا كنت تريد لف العناصر، أو تحويلها أو إعدادها بعد تحميلها. و لأن هذا العمل يتم إنجازه على منفذ الجلب..

يمكنك القيام بعمل مكلف، مثل القراءة من القرص، أو الإستعلام عن قاعدة بيانات منفصلة.

 

ملاحظة: تكون إستعلامات JOIN دوماً أكثر فاعلية، عند إعادة الإستعلام كجزء من ()map.

 

 

 

 

تقديم التعليقات


شارك ملاحظاتك وأفكارك معنا من خلال هذه المصادر:

تعقب مشكلة

الإبلاغ عن المشاكل حتى نتمكن من إصلاح الأخطاء.

 

 

 

مصادر إضافية


لمعرفة المزيد حول مكتبة الترحيل، راجع الدلائل ومقاطع الفيديو التالية:

  • نموذج إختبار: تعلم كيفية إضافة مكتبة الترحيل إلى التطبيق، خطوة بخطوة.
  • نموذج PagingWithNetwork: أنظر كيف تعمل مكتبة الترحيل مع واجهة برمجة تطبيقات الواجهة الخلفية.
  • جلسة Google I / O: شاهد هذا الفيديو الذي يقوم بتعريف مكتبة الترحيل.

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات

1 thought on “مكونات وإعتبارات بيانات مكتبة الترحيل”

اترك رد