ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制。一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制。并且此种方式忽略了底层的数据存储实现,ContentProvider提供了一种统一的通过Uri实现数据操作的方式。其步骤为:
1. 在当前应用程序中定义一个ContentProvider。
2. 在当前应用程序的AndroidManifest.xml中注册此ContentProvider
3. 其他应用程序通过ContentResolver和Uri来获取此ContentProvider的数据。
1、开发ContentProvider
开发ContentProvider需要两步:
--开发一个ContentProvider的子类,该子类需要实现query()、insert()、updata()、delete()等方法
--在AndroidManifest.xml文件中注册该ContentProvider,制定android:authorities属性
2、使用ContentResolver调用方法
具体实现代码如下:
在应用程序A中:
package com.ye_yun_lin.contentprovider;import android.net.Uri;import android.os.Bundle;import android.app.Activity;import android.content.ContentProvider;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.view.Menu;public class MainActivity extends ContentProvider { @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override public boolean onCreate() { SQLiteDatabase sqLiteDatabase=this.getContext().openOrCreateDatabase("test_provider", Context.MODE_PRIVATE, null); sqLiteDatabase.execSQL("create table tab(_id integer primary key, name verchar(255))"); ContentValues contentValues=new ContentValues(); contentValues.put("name", "zhangsan"); sqLiteDatabase.insert("tab", "_id", contentValues); sqLiteDatabase.close(); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase sqLiteDatabase=this.getContext().openOrCreateDatabase("test_provider", Context.MODE_PRIVATE, null); Cursor cursor=sqLiteDatabase.query("tab", null,null,null,null,null,null); return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } }
在AndroidManifest中注册:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ye_yun_lin.contentprovider" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.ye_yun_lin.contentprovider.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="com.ye_yun_lin.contentprovider.MainActivity" android:authorities="com.ye_yun_lin.contentprovider.MainActivity.pro" android:exported="true"/> </application></manifest>
在程序B中调用:
package com.ye_yun_lin.contentresolver;import android.net.Uri;import android.os.Bundle;import android.app.Activity;import android.content.ContentResolver;import android.content.Context;import android.database.Cursor;import android.util.Log;import android.view.Menu;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取上下文 Context ctx = MainActivity.this; //获取ContentResolver对象 ContentResolver resolver = ctx.getContentResolver(); //获取Uri对象 Uri uri = Uri.parse("content://com.ye_yun_lin.contentprovider.MainActivity.pro/"); //获取数据 Cursor c = resolver.query(uri, null, null, null, null); c.moveToFirst(); for(int i=0; i<c.getCount(); i++){ int index = c.getColumnIndexOrThrow("name"); String src = c.getString(index); System.out.println(src); c.moveToNext(); } }}
运行结果如下: