מסגרת מתאם הסנכרון תוכננה לפעול עם נתוני מכשירים שמנוהלים באמצעות של ספק תוכן מאובטח מאוד. מסיבה זו, ה-framework של מתאם הסנכרון מצפה שאפליקציה שמשתמשת ב-framework כבר הגדירה ספק תוכן לנתונים המקומיים שלה. אם במסגרת מתאם הסנכרון מנסה להפעיל את מתאם הסנכרון, ובאפליקציה אין ספק התוכן, מתאם הסנכרון קורס.
אם אתם מפתחים אפליקציה חדשה שמעבירה נתונים משרת למכשיר, מומלץ מאוד לאחסן את הנתונים המקומיים בספק תוכן. מלבד החשיבות שלהם, מתאמי סנכרון, ספקי תוכן מציעים מגוון יתרונות אבטחה ובמיוחד שמיועד לטיפול באחסון נתונים במערכות Android. למידע נוסף על יצירת תוכן ספק תוכן, ראה יצירת ספק תוכן.
עם זאת, אם אתם כבר מאחסנים נתונים מקומיים בצורה אחרת, עדיין אפשר להשתמש בסנכרון
כדי לטפל בהעברת נתונים. כדי לעמוד בדרישה של מסגרת מתאם הסנכרון עבור
ספק תוכן, עליך להוסיף ספק תוכן stub לאפליקציה. ספק stub מיישם את
המחלקה של ספק התוכן, אבל כל השיטות הנדרשות מחזירה null
או 0
. אם
הוספת ספק stub, אחר כך אפשר להשתמש במתאם סנכרון כדי להעביר נתונים מכל אמצעי אחסון
על המנגנון שבחרתם.
אם כבר יש לך ספק תוכן באפליקציה, אין צורך בספק תוכן stub. במקרה כזה, אפשר לדלג על השיעור הזה ולהמשיך לשיעור יצירת מתאם סנכרון. אם אין לך עדיין של ספק התוכן הזה, בשיעור הזה תלמדו איך להוסיף ספק תוכן stub שמאפשר לכם מחברים את מתאם הסנכרון ל-framework.
הוספת ספק של תוכן stub
כדי ליצור ספק תוכן stub של האפליקציה, צריך להרחיב את הכיתה
ContentProvider
ולאתר את השיטות הנדרשות. הבאים
בקטע הזה מוסבר איך ליצור את ספק ה-stub:
Kotlin
/* * Define an implementation of ContentProvider that stubs out * all methods */ class StubProvider : ContentProvider() { /* * Always return true, indicating that the * provider loaded correctly. */ override fun onCreate(): Boolean = true /* * Return no type for MIME type */ override fun getType(uri: Uri): String? = null /* * query() always returns no results * */ override fun query( uri: Uri, projection: Array<String>, selection: String, selectionArgs: Array<String>, sortOrder: String ): Cursor? = null /* * insert() always returns null (no URI) */ override fun insert(uri: Uri, values: ContentValues): Uri? = null /* * delete() always returns "no rows affected" (0) */ override fun delete(uri: Uri, selection: String, selectionArgs: Array<String>): Int = 0 /* * update() always returns "no rows affected" (0) */ override fun update( uri: Uri, values: ContentValues, selection: String, selectionArgs: Array<String> ): Int = 0 }
Java
/* * Define an implementation of ContentProvider that stubs out * all methods */ public class StubProvider extends ContentProvider { /* * Always return true, indicating that the * provider loaded correctly. */ @Override public boolean onCreate() { return true; } /* * Return no type for MIME type */ @Override public String getType(Uri uri) { return null; } /* * query() always returns no results * */ @Override public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return null; } /* * insert() always returns null (no URI) */ @Override public Uri insert(Uri uri, ContentValues values) { return null; } /* * delete() always returns "no rows affected" (0) */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } /* * update() always returns "no rows affected" (0) */ public int update( Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } }
הצהרה על הספק במניפסט
מסגרת מתאם הסנכרון מאמתת שלאפליקציה שלך יש ספק תוכן על ידי בדיקה
האפליקציה הצהירה על ספק בקובץ המניפסט של האפליקציה. כדי להצהיר על ספק ה-stub ב
מניפסט, צריך להוסיף רכיב <provider>
עם המאפיינים הבאים:
-
android:name="com.example.android.datasync.provider.StubProvider"
- מציין את השם המוגדר במלואו של המחלקה שבה מוטמע ספק תוכן ה-stub.
-
android:authorities="com.example.android.datasync.provider"
- רשות URI שמזהה את ספק תוכן ה-stub. הגדרת הערך הזה כערך של האפליקציה שם חבילה עם המחרוזת ' .provider' שצורפו אליה. למרות שהצהרת על ספק ה-stub של המערכת, שום דבר לא מנסה לגשת לספק עצמו.
-
android:exported="false"
-
המדיניות קובעת אם אפליקציות אחרות יכולות לגשת לספק התוכן. לתוכן המשני שלך
הספק, צריך להגדיר את הערך ל-
false
, כי אין צורך לאפשר לאפליקציות אחרות לראות הספק. הערך הזה לא משפיע על האינטראקציה בין מסגרת מתאם הסנכרון וספק התוכן. -
android:syncable="true"
-
מגדיר דגל שמציין שניתן לסנכרן את הספק. אם מגדירים את הסימון הזה בתור
true
, אין צורך לקרוא ל-setIsSyncable()
בקוד שלך. הדגל מאפשר למסגרת של מתאם הסנכרון ליצור נתונים מועברות אצל ספק התוכן, אבל ההעברות מתבצעות רק אם עושים זאת באופן מפורש.
בקטע הקוד הבא מוסבר איך להוסיף את
רכיב <provider>
לקובץ המניפסט של האפליקציה:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.network.sync.BasicSyncAdapter" android:versionCode="1" android:versionName="1.0" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > ... <provider android:name="com.example.android.datasync.provider.StubProvider" android:authorities="com.example.android.datasync.provider" android:exported="false" android:syncable="true"/> ... </application> </manifest>
אחרי שיצרתם את יחסי התלות הנדרשים על ידי מסגרת מתאם הסנכרון, תוכלו תיצור את הרכיב שמכסה את הקוד להעברת נתונים. הרכיב הזה נקרא למתאם הסנכרון. בשיעור הבא תלמדו איך להוסיף את הרכיב הזה לאפליקציה.