在编写Android程序的时候,有时候我们会需要将程序中的某些数据暴露给其他的程序访问,这时候我们就可以使用ContentProvider实现该功能。ContentProvider可以通过一定的格式将我们程序中的数据(可能是私有文件中的数据或者数据库中的数据等)暴露给其他程序访问。
在编写ContentProvider的时候我们需要使用如下的步骤:
1 编写一个java类继承ContentProvider类,然后实现里面的方法。
2 在AndroidManifest.xml配置该ContentProvider。
编写完了我们还需要从该ContentProvider获取数据,这时候我们就可以直接实例化一个ContentResolver对象,然后调用其中的方法对数据进行操作。
下面简单列出部分代码:
自定义的ContentProvider代码:
package com.mxy; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.util.Log; /** * 使用contentProvider的时候 数据库不需要关闭 * @author mxy * 我们在操作该ContentProvider数据的时候,需要根据特定的Uri去操作 * Uri构造格式如下:content://<AndroidManifest.xml配置的provider的authorities名字>/自定义内容 */ public class MyProvider extends ContentProvider { private static int NOMATCH = -1; private static int INSERT = 1; private static int QUERY = 2; private static int UPDATE = 3; private static int DELETE = 4; //为了方便我们操作Google提供了UriMatcher,我们可以通过该类去构造我们能够匹配 //的Uri,当然我们也可以自己去进行匹配,但是那样容易书写错误 private static UriMatcher matcher = new UriMatcher(NOMATCH); static{ matcher.addURI("com.mxy.MyProvider", "insert", INSERT); matcher.addURI("com.mxy.MyProvider", "query", QUERY); matcher.addURI("com.mxy.MyProvider", "update", UPDATE); matcher.addURI("com.mxy.MyProvider", "delete", DELETE); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { Log.i("mxy", "provider delete" + matcher.match(uri)); return 0; } @Override public String getType(Uri uri) { Log.i("mxy", "provider getType" + matcher.match(uri)); return null; } @Override public Uri insert(Uri uri, ContentValues values) { Log.i("mxy", "provider insert" + matcher.match(uri)); return null; } @Override public boolean onCreate() { Log.i("mxy", "provider onCreate"); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Log.i("mxy", "provider query" + matcher.match(uri)); if(QUERY == matcher.match(uri)){ PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext()); SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder); return cursor; }else{ return null; } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { Log.i("mxy", "provider update" + matcher.match(uri)); return 0; } }
上面的代码中使用到了Sqlite数据的操作,我没有粘贴出来,可以下载源码工程查看。
AndroidManifest.xml需要配置Provider:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mxy" 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.mxy.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.mxy.MyProvider" android:authorities="com.mxy.MyProvider" android:exported="true"><!-- android4.2以上需要添加该选项,表示是否能够被其他应用调用 --> </provider> </application> </manifest>
这样我们就可以运行这个工程,这样就可以创建一个ContentProvider了,下面我们需要另一个程序去使用ContentProvider,另外一个程序的主要代码如下:
package com.mxy.contentProviderReader; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; 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); //读取contentprovider 数据 ContentResolver resolver = this.getContentResolver(); Uri uri = Uri.parse("content://com.mxy.MyProvider/query"); Cursor cursor = resolver.query(uri, null,null ,null, null); Log.i("mxy", cursor + "--------" ); while(cursor != null && cursor.moveToNext()){ int id = cursor.getInt(cursor.getColumnIndex("id")); String number = cursor.getString(2); Log.i("mxy", "id:" + id + " number:" + number); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
两个程序都没有见面元素,结果都是在logcat中显示的。
例子工程下载地址:http://download.csdn.net/detail/mengxiangyue/7079701
http://download.csdn.net/detail/mengxiangyue/7079717
转载请注明出处:http://blog.csdn.net/mengxiangyu