自定义contentprovider

来源:互联网 发布:我的淘宝界面音乐 编辑:程序博客网 时间:2024/05/16 02:49

大家知道我们可以通过contentprovider去调用其它应用提供的数据,类似PC的共享。比如我们可以访问手机联系人,手机文件扫描等等,通常是用统一资源定位符去定位android系统中的某个资源,格式如:Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact"),这样我们就可以访问到联系人了,这些都是因为其他应用程序提供了我们一个访问数据的接口。

有时候我们需要把自己的某些数据暴露给其他应用程序,比如我们公司同时开发了好几个应用,但是这几个应用需要相互访问数据。这样我们就需要使用四大控件中的contentprovider了。我们需要自定义一个内容提供者。下面开始上代码:

一,现在manifest配置文件中添加

<provider android:name=".MyContentProvider"android:authorities="com.wissen.testApp.MyContentProvider" />
这句话与activity标签平级即可

二,然后就可以自定义数据的对外接口了。自定义一个地址,供其它应用访问:

public class MyUsers {// 鉴权public static final String AUTHORITY = "com.wissen.testApp.MyContentProvider";// BaseColumn类中已经包含了 _id字段public static final class User implements BaseColumns {public static final Uri CONTENT_URI = Uri.parse("content://com.wissen.testApp.MyContentProvider");// 表数据列public static final String USER_NAME = "USER_NAME";}}

三,上面定义的地址,也就是uri,一会儿就能在其它应用中调用了,就像我们调用手机里的联系人一样。

不过在调用之前我们需要先定义自己的数据库和provider用来存取数据。数据库存,provider读。

public class MyContentProvider extends ContentProvider {private SQLiteDatabase sqlDB;private DatabaseHelper dbHelper;private static final String DATABASE_NAME = "Users.db";private static final int DATABASE_VERSION = 1;private static final String TABLE_NAME = "User";private static final String TAG = "MyContentProvider";private static class DatabaseHelper extends SQLiteOpenHelper {DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {// 创建用于存储数据的表db.execSQL("Create table "+ TABLE_NAME+ "( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);onCreate(db);}}@Overridepublic int delete(Uri uri, String s, String[] as) {return 0;}@Overridepublic String getType(Uri uri) {return null;}@Overridepublic Uri insert(Uri uri, ContentValues contentvalues) {sqlDB = dbHelper.getWritableDatabase();long rowId = sqlDB.insert(TABLE_NAME, "", contentvalues);if (rowId > 0) {Uri rowUri = ContentUris.appendId(MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();getContext().getContentResolver().notifyChange(rowUri, null);return rowUri;}throw new SQLException("Failed to insert row into " + uri);}@Overridepublic boolean onCreate() {dbHelper = new DatabaseHelper(getContext());return (dbHelper == null) ? false : true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {SQLiteQueryBuilder qb = new SQLiteQueryBuilder();SQLiteDatabase db = dbHelper.getReadableDatabase();qb.setTables(TABLE_NAME);Cursor c = qb.query(db, projection, selection, null, null, null,sortOrder);c.setNotificationUri(getContext().getContentResolver(), uri);return c;}@Overridepublic int update(Uri uri, ContentValues contentvalues, String s,String[] as) {return 0;}}

四,最后我们在Activity前端请求provider中的数据,这里我们先存一条数据,然后再取全部的数据。如下:

public class MyContentDemo extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);insertRecord("测试");displayRecords();}private void insertRecord(String userName) {ContentValues values = new ContentValues();values.put(MyUsers.User.USER_NAME, userName);getContentResolver().insert(MyUsers.User.CONTENT_URI, values);}private void displayRecords() {String columns[] = new String[] { MyUsers.User._ID,MyUsers.User.USER_NAME };Uri myUri = MyUsers.User.CONTENT_URI;Cursor cur = managedQuery(myUri, columns, null, null, null);if (cur.moveToFirst()) {String id = null;String userName = null;do {id = cur.getString(cur.getColumnIndex(MyUsers.User._ID));userName = cur.getString(cur.getColumnIndex(MyUsers.User.USER_NAME));Toast.makeText(this, id + " " + userName, Toast.LENGTH_SHORT).show();} while (cur.moveToNext());}}}

测下来没问题,关闭应用后,再开,toast两次,因为此时provider的后台数据库中有了2条数据。


到这里,自定义的provider就写完了。下面正式开始在其它应用中,调用该应用中的数据。

很简单,重建一个工程,把上面Demo和MyUser类考过去就可以了。运行,OK

下载地址:http://download.csdn.net/detail/r8hzgemq/4798235




原创粉丝点击