標籤:
當應用繼承ContentProvider類,並重寫該類用於提供資料和儲存資料的方法,就可以向其他應用共用其資料。以前我們學習過檔案的操作模式,通過指定檔案的操作模式為Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同樣可以對外共用資料,但資料的訪問方式會因資料存放區的方式而不同,如:採用xml檔案對外共用資料,需要進行xml解析來讀寫資料;採用sharedpreferences共用資料,需要使用sharedpreferences API讀寫資料。而使用ContentProvider共用資料的好處是統一了資料訪問方式。
1.第一步需要繼承ContentProvider並重寫下面方法:
public class PersonContentProvider extends ContentProvider{
public boolean onCreate()
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)}
2. 第二步需要在AndroidManifest.xml使用<provider>對該ContentProvider進行配置,為了能讓其他應用找到該ContentProvider , ContentProvider 採用了authorities(主機名稱/網域名稱)對它進行唯一標識,你可以把 ContentProvider看作是一個網站(想想,網站也是提供資料者),authorities 就是他的網域名稱:
<manifest .... >
<application android:icon="@drawable/icon" android:label="@string/app_name">
<provider android:name=".UserProvider" android:authorities="com.example.providerdemo.userProvider"/>
</application>
</manifest>
注意:一旦應用繼承了ContentProvider類,後面我們就會把這個應用稱為ContentProvider(內容提供者)。
ProviderDemo 擁有DB, 提供Provider,供外圍進行增刪改查。 (這裡可以類比通訊錄)
OneApp對他進行 操作
provider定義:
/** * */package com.example.providerdemo;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;/** * * @author baoxing.gbx * @version $Id: UserProvider.java, v 0.1 2015年8月21日 上午10:25:48 baoxing.gbx Exp $ */public class UserProvider extends ContentProvider{ private DBopenHelper dbOpenHelper; private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); private static final int UserOne = 1; private static final int UserList = 2; static{ MATCHER.addURI("com.example.providerdemo.userProvider", "user", UserList); MATCHER.addURI("com.example.providerdemo.userProvider", "user/#", UserOne); } @Override public boolean onCreate() { dbOpenHelper = new DBopenHelper(this.getContext()); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); switch (MATCHER.match(uri)) { case UserOne: long key = ContentUris.parseId(uri); String where = "id = "+ key; if(selection!=null && !"".equals(selection.trim())){ where += " and "+ selection; } Cursor cursor = db.query("user", null, where, selectionArgs, null, null, null, null); return cursor; case UserList: cursor = db.query("user", null, null, selectionArgs, null, null, null, null); return cursor; default: throw new IllegalArgumentException("this is Unknown Uri:"+ uri); } } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); switch (MATCHER.match(uri)) { case UserOne: long rowid = db.insert("user", "", values);//主索引值 Uri insertUri = ContentUris.withAppendedId(uri, rowid); this.getContext().getContentResolver().notifyChange(uri, null);//發出資料變化通知 return insertUri; default: throw new IllegalArgumentException("this is Unknown Uri:"+ uri); } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int nnum = 0; switch (MATCHER.match(uri)) { case UserOne: long key = ContentUris.parseId(uri); String where = "id = " + key; if (null != selection && !"".equals(selection)) { where += "and " + selection; } nnum = db.delete("user", where, selectionArgs); return nnum; case UserList: nnum = db.delete("user", selection, selectionArgs); return nnum; default: throw new IllegalArgumentException("this is Unknown Uri:"+ uri); } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int nnum = 0 ; switch (MATCHER.match(uri)) { case UserOne: long key = ContentUris.parseId(uri); String where = "id = " + key; if (null != selection && !"".equals(selection)) { where += "and " + selection; } nnum = db.update("user", values, where, selectionArgs); return nnum; case UserList: nnum = db.update("user", values, selection, selectionArgs); return nnum; default: throw new IllegalArgumentException("this is Unknown Uri:"+ uri); } }}
DB操作:
package com.example.providerdemo;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;import android.nfc.Tag;import android.os.Build.VERSION;import android.util.Log; /** * * @author baoxing.gbx * @version $Id: DBopenHelper.java, v 0.1 2015年7月11日 下午9:39:03 baoxing.gbx Exp $ */public class DBopenHelper extends SQLiteOpenHelper{ /** 資料庫名稱 */ private static final String DB_NAME = "test.db"; private static final int VERSION = 1; private static final String Tag = "DBopenHelper"; // 初始化資料庫開啟裝置 public DBopenHelper(Context context) { super(context, DB_NAME, null, VERSION); // TODO Auto-generated constructor stub } // @Override public void onCreate(SQLiteDatabase db) { Log.i(Tag, "onCreate 被調用"); db.execSQL("create table user (id integer primary key autoincrement, name varchar(20),sex varchar(20), age integer )"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i(Tag, "onUpgrade 被調用"); db.execSQL("DROP TABLE IF EXISTS person"); onCreate(db); } }
OneApp測試
/** * */package com.demo.oneapp.test;import java.util.Date;import android.R.integer;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.test.AndroidTestCase;import android.util.Log;/** * * @author baoxing.gbx * @version $Id: TestProvider.java, v 0.1 2015年8月20日 下午8:50:13 baoxing.gbx Exp $ */public class TestProvider extends AndroidTestCase { public void testAdd() { Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user"); ContentResolver resolver = this.getContext().getContentResolver(); for (int i = 0; i < 10; ++i) { ContentValues values = new ContentValues(); values.put("name", "muyou" + i); values.put("sex", "男"); values.put("age", 18 + i); Uri uri2 = resolver.insert(uri, values); System.out.println("完成:" + uri2); } } public void testDel() { // 查詢單個 Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user/2"); ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); String sex = cursor.getString(cursor.getColumnIndex("sex")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery", "id="+ id + "name=" + name + "sex=" + sex + "age=" + age); } uri = Uri.parse("content://com.example.providerdemo.userProvider/user/2"); resolver = this.getContext().getContentResolver(); resolver.delete(uri, null, null); // 查詢單個 uri = Uri.parse("content://com.example.providerdemo.userProvider/user/2"); resolver = this.getContext().getContentResolver(); cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); String sex = cursor.getString(cursor.getColumnIndex("sex")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery", "id="+ id + "name=" + name + "sex=" + sex + "age=" + age); } } public void testUpdate() { // 查詢單個 Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user/3"); ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); String sex = cursor.getString(cursor.getColumnIndex("sex")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery", "id="+ id + "name=" + name + "sex=" + sex + "age=" + age); } uri = Uri.parse("content://com.example.providerdemo.userProvider/user/3"); resolver = this.getContext().getContentResolver(); ContentValues values = new ContentValues(); values.put("name", "cool"); resolver.update(uri, values, null, null); // 查詢單個 uri = Uri.parse("content://com.example.providerdemo.userProvider/user/3"); resolver = this.getContext().getContentResolver(); cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); String sex = cursor.getString(cursor.getColumnIndex("sex")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery", "id="+ id + "name=" + name + "sex=" + sex + "age=" + age); } } public void testQuery() { // 查詢所有 Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user"); ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); String sex = cursor.getString(cursor.getColumnIndex("sex")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery", "id="+ id + "name=" + name + "sex=" + sex + "age=" + age); } // 查詢單個 uri = Uri.parse("content://com.example.providerdemo.userProvider/user/5"); resolver = this.getContext().getContentResolver(); cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); String sex = cursor.getString(cursor.getColumnIndex("sex")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery", "id="+ id + "name=" + name + "sex=" + sex + "age=" + age); } } }
Android ContentProvider 簡單學習