日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

provider android简书,Android 使用ContentProvider在应用间共享数据

發(fā)布時(shí)間:2024/2/28 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 provider android简书,Android 使用ContentProvider在应用间共享数据 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android 使用ContentProvider在應(yīng)用間共享數(shù)據(jù)

題圖 www.gratisography.com

在開(kāi)發(fā)的過(guò)程中,有時(shí)會(huì)有需求要實(shí)現(xiàn)應(yīng)用程序之間實(shí)現(xiàn)數(shù)據(jù)共享,在Android系統(tǒng)中提供了一個(gè)內(nèi)容提供者ContentProvider

可以實(shí)現(xiàn)這個(gè)功能,需要繼承這個(gè)類(lèi),并實(shí)現(xiàn)相關(guān)的接口,其他的應(yīng)用就可以通過(guò)uri來(lái)訪問(wèn)相關(guān)的數(shù)據(jù),在Android中最常見(jiàn)的

內(nèi)容提供者就是MediaProvider,所有的應(yīng)用都可以通過(guò)uri來(lái)訪問(wèn)系統(tǒng)中的媒體數(shù)據(jù),我們也可以實(shí)現(xiàn)這樣的功能,首先就是要

確定你的應(yīng)用是否要向外提供數(shù)據(jù)

設(shè)計(jì)數(shù)據(jù)存儲(chǔ)

我們這里是通過(guò)數(shù)據(jù)庫(kù)最為媒介來(lái)提供數(shù)據(jù),需要設(shè)計(jì)具體的數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu),通過(guò)系統(tǒng)提供的SQLiteOpenHelper類(lèi)來(lái)創(chuàng)建數(shù)據(jù)庫(kù)

核心的代碼:

簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),根據(jù)自己的需求設(shè)計(jì)數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)

public final class Settings implements BaseColumns{

private Settings(){}

public static final String TABLE_NAME = "settings"; //數(shù)據(jù)庫(kù)中標(biāo)的名稱(chēng)

public static final String COLUMN_NAME_TITLE = "name"; //表中的列名

public static final String COLUMN_NAME_VALUE = "value"; //表中的列名

}

繼承SQLiteOpenHelper來(lái)創(chuàng)建數(shù)據(jù)庫(kù)

private static class DatabaseHelper extends SQLiteOpenHelper{

public DatabaseHelper(Context context) {

super(context, DB_NAME, null, DB_VERSION);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("DROP TABLE IF EXISTS settings");

onCreate(db);

}

@Override

public void onCreate(SQLiteDatabase db) {

String sql = " CREATE TABLE "+Settings.TABLE_NAME +" ("

+ Settings._ID +" INTEGER PRIMARY KEY,"

+ Settings.COLUMN_NAME_TITLE +" TEXT,"

+ Settings.COLUMN_NAME_VALUE +" TEXT"

+ ");";

db.execSQL(sql);

}

}

內(nèi)容提供者

ContentProvider需重載的接口如下:

public Uri insert(Uri uri, ContentValues values)

public int delete(Uri uri, String selection, String[] selectionArgs)

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

public String getType(Uri uri)

URI的設(shè)計(jì)

[content://][com.example.demo.gank.provider][/settings][/1]

|-----A-----|---------------B---------------|-----C----|--D-|

A:是Scheme,固定為content://

B: 是Authority,用來(lái)識(shí)別特定的Content Provider,一般使用應(yīng)用的報(bào)名來(lái)命名

C:是資源的路徑

D: 資源的ID

為了傳入的uri執(zhí)行不同的操作,可以通過(guò)Android中的UriMatcher實(shí)體類(lèi),將uri映射不同的內(nèi)容

設(shè)置權(quán)限

可以為provider設(shè)置權(quán)限

package="com.example.demo.gank">

。。。。

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

android:authorities="com.example.demo.gank.provider"

android:name="com.example.demo.gank.provider.SettingsProvider"

android:readPermission="com.example.demo.gank.provider.READ_PROVIDER"

android:writePermission="com.example.demo.gank.provider.WRITE_PROVIDER"

android:exported="true">

運(yùn)行工程,這個(gè)工程應(yīng)用是A,A應(yīng)用安裝之后,這個(gè)應(yīng)用就是一個(gè)內(nèi)容提供者

再建一個(gè)工程B,在B中訪問(wèn)數(shù)據(jù),這個(gè)是工程B中訪問(wèn)數(shù)據(jù)庫(kù)的代碼

Uri uri = Uri.parse("content://com.example.demo.gank.provider/settings"); //和A中提供的uri保持一致

Cursor c = getContentResolver().query(uri,new String[]{"name","value"}," name =? ", //是在A中定義的數(shù)據(jù)庫(kù)的字段

new String[]{"settings"},null);

if(c != null && c.moveToFirst()){

String value = c.getString(c.getColumnIndex("value"));

log.e(TAG,"=================query value: "+value);

}

在B中的AndroidManifest.xml'中加入相關(guān)的權(quán)限

運(yùn)行結(jié)果就是得到A中數(shù)據(jù)庫(kù)的內(nèi)容

代碼

核心的邏輯代碼,具體的代碼請(qǐng)參考源碼 工程源碼

Settings.java

public static final String SCHEME = "content://";

private static final String PATH_SETTINGS = "/settings";

private static final String PATH_SETTINGS_ID = "/settings/";

public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.com.example.demo.gank.settings";

public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.com.example.demo.gank.settings";

SettingsProvider.java

public class SettingsProvider extends ContentProvider{

private static final String DB_NAME = "settings.db";

private static final int DB_VERSION = 1;

private static final int SETTINGS = 1;

private static final int SETTINGS_ID = 2;

//....

static {

sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

sUriMatcher.addURI(Settings.AUTHORITY,"settings",SETTINGS);

sUriMatcher.addURI(Settings.AUTHORITY,"settings/#",SETTINGS_ID);

sProjectionMap = new HashMap<>();

sProjectionMap.put(Settings.COLUMN_NAME_TITLE,Settings.COLUMN_NAME_TITLE);

sProjectionMap.put(Settings.COLUMN_NAME_VALUE,Settings.COLUMN_NAME_VALUE);

sProjectionMap.put(Settings._ID,Settings._ID);

}

@Nullable

@Override

public Uri insert(Uri uri, ContentValues values) {

return null;

}

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

return 0;

}

@Override

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {

return 0;

}

@Nullable

@Override

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

return null;

}

@Nullable

@Override

public String getType(Uri uri) {

return null;

}

@Override

public boolean onCreate() {

mOPenHelper = new DatabaseHelper(getContext());

return true;

}

private static class DatabaseHelper extends SQLiteOpenHelper{

//具體的代碼請(qǐng)參看源碼

//。。。。

}

}

總結(jié)

以上是生活随笔為你收集整理的provider android简书,Android 使用ContentProvider在应用间共享数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。