W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
編寫:jdneo - 原文:http://developer.android.com/training/sync-adapters/creating-stub-provider.html
Sync Adapter 框架是設(shè)計成用來和設(shè)備數(shù)據(jù)一起工作的,而這些設(shè)備數(shù)據(jù)應(yīng)該被靈活且安全的 Content Provider 框架管理。因此,Sync Adapter 框架會期望應(yīng)用已經(jīng)為它的本地數(shù)據(jù)定義了 Content Provider。如果 Sync Adapter 框架嘗試去運(yùn)行我們的 Sync Adapter,而我們的應(yīng)用沒有一個 Content Provider 的話,那么 Sync Adapter 將會崩潰。
如果我們正在開發(fā)一個新的應(yīng)用,它將數(shù)據(jù)從服務(wù)器傳輸?shù)揭慌_設(shè)備上,那么我們務(wù)必考慮將本地數(shù)據(jù)存儲于 Content Provider 中。除了它對于 Sync Adapter 的重要性之外,Content Provider 還可以提供許多安全上的好處,更何況它是專門為了在 Android 設(shè)備上處理數(shù)據(jù)存儲而設(shè)計的。要學(xué)習(xí)如何創(chuàng)建一個 Content Provider,可以閱讀:Creating a Content Provider。
然而,如果我們已經(jīng)通過別的形式來存儲本地數(shù)據(jù),我們?nèi)匀豢梢允褂?Sync Adapter 來處理數(shù)據(jù)傳輸。為了滿足 Sync Adapter 框架對于 Content Provider 的要求,我們可以在應(yīng)用中添加一個 Stub Content Provider。一個 Stub Content Provider 實現(xiàn)了 Content Provider 類,但是所有的方法都返回 null
或者 0
。如果我們添加了一個 Stub Content Provider,那么無論數(shù)據(jù)存儲機(jī)制是什么,我們都可以使用 Sync Adapter 來傳輸數(shù)據(jù)。
如果在我們的應(yīng)用中已經(jīng)有了一個 Content Provider,那么我們就不需要創(chuàng)建 Stub Content Provider 了。在這種情況下,我們可以略過這節(jié)課程,直接進(jìn)入:創(chuàng)建 Sync Adapter。如果你還沒有創(chuàng)建 Content Provider,這節(jié)課將向你展示如何通過添加一個 Stub Content Provider,將你的 Sync Adapter 添加到框架中。
要為我們的應(yīng)用創(chuàng)建一個 Stub Content Provider,首先繼承 ContentProvider 類,并且在所有需要重寫的方法中,我們一律不進(jìn)行任何處理而是直接返回。下面的代碼片段展示了我們應(yīng)該如何創(chuàng)建一個 Stub Content Provider:
/*
* 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 an empty String for MIME type
*/
@Override
public String getType() {
return new String();
}
/*
* 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;
}
}
Sync Adapter 框架會通過查看應(yīng)用的 manifest 文件中是否聲明了 provider,來驗證我們的應(yīng)用是否使用了 Content Provider。為了在 manifest 清單文件中聲明我們的 Stub Content Provider,添加一個 <provider>
標(biāo)簽,并讓它擁有下列屬性字段:
android:name="com.example.android.datasync.provider.StubProvider"
指定實現(xiàn) Stub Content Provider 類的完整包名。
android:authorities="com.example.android.datasync.provider"
指定 Stub Content Provider 的 URI Authority。用應(yīng)用的包名加上字符串 ".provider"
作為該屬性字段的值。雖然我們在這里向系統(tǒng)聲明了 Stub Content Provider,但是不會嘗試訪問 Provider 本身。
android:exported="false"
確定其它應(yīng)用是否可以訪問 Content Provider。對于 Stub Content Provider 而言,由于沒有讓其它應(yīng)用訪問該 Provider 的必要,所以我們將該值設(shè)置為 false
。該值并不會影響 Sync Adapter 框架和 Content Provider 之間的交互。
android:syncable="true"
該標(biāo)識指明 Provider 是可同步的。如果將這個值設(shè)置為 true
,那么將不需要在代碼中調(diào)用 setIsSyncable()。這一標(biāo)識將會允許 Sync Adapter 框架和 Content Provider 進(jìn)行數(shù)據(jù)傳輸,但是僅僅在我們顯式地執(zhí)行相關(guān)調(diào)用時,這一傳輸時才會進(jìn)行。
下面的代碼片段展示了我們應(yīng)該如何將 <provider>
標(biāo)簽添加到應(yīng)用的 manifest 清單文件中:
<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>
現(xiàn)在我們已經(jīng)創(chuàng)建了所有 Sync Adapter 框架所需要的依賴項,接下來我們可以創(chuàng)建封裝數(shù)據(jù)傳輸代碼的組件了。該組件就叫做 Sync Adapter。在下節(jié)課中,我們將會展示如何將這一組件添加到應(yīng)用中。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: