Android四大组件之ContentProvider使用实例

来源:互联网 发布:知达常青藤中学校官网 编辑:程序博客网 时间:2024/05/29 00:30

1、创建数据库管理类,并创建所需的表和数据

package com.cx.datastored;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class MyDatabaseHelper extends SQLiteOpenHelper {    private static final String  DATABASE_NAME = "Users.db";    private static final int  DATABASE_VERSION= 1;    private static final String TABLE_NAME= "User";public MyDatabaseHelper(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);}}
2、创建一个类,定义uri并存储用户名称并显示所有的用户名称(使用 SQLLite数据库存储这些数据)
import android.net.Uri;import android.provider.BaseColumns;public class MyUsers {public static final String AUTHORITY = "com.cx.datastored.MyContentProvider";    //BaseColumn类中已经包含了 _id字段public static final class User implements BaseColumns {//定义uri        public static final Uri CONTENT_URI  = Uri.parse("content://com.cx.datastored.MyContentProvider");        // 表数据列        public static final String USER_NAME = "USER_NAME";    }}

3、重写ContentProvider,完成自己的MyContentProvider,这里只做了插入和查询功能

import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteQueryBuilder;import android.net.Uri;public class MyContentProvider extends ContentProvider {private SQLiteDatabase sqlDB;    private MyDatabaseHelper dbHelper;    private static final String TABLE_NAME= "User";@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {//根据Uri删除arg1指定的条件所匹配的全部记录return 0;}@Overridepublic String getType(Uri arg0) {//返回当前Uri的MIME类型,如果该URI对应的数据可能包含多条记录,那么MIME类型字符串就是以vnd.android.dir开头//如果该URI对应的数据只有一条,该MIME类型字符串就是以vnd..android.cursor.item开头return null;}@Overridepublic Uri insert(Uri arg0, ContentValues arg1) {//根据Uri插入arg1对应的数据sqlDB = dbHelper.getWritableDatabase();        long rowId = sqlDB.insert(TABLE_NAME, "", arg1);        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 " + arg0);}@Overridepublic boolean onCreate() {// 在ContentProvider创建后被调用 dbHelper = new MyDatabaseHelper(getContext());     return (dbHelper == null) ? false : true;}@Overridepublic Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,String arg4) {//根据Uri查询出arg2指定的条件所匹配的全部记录,并且可以指定查询那些列,以什么方式(arg4)排序SQLiteQueryBuilder qb = new SQLiteQueryBuilder();        SQLiteDatabase db = dbHelper.getReadableDatabase();        qb.setTables(TABLE_NAME);        Cursor c = qb.query(db, arg1, arg2, null, null, null, arg4);        c.setNotificationUri(getContext().getContentResolver(), arg0);        return c;}@Overridepublic int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {//根据Uri修改arg2指定的条件所匹配的全部记录return 0;}}

4、 在AndroidMenifest.xml中使用<provider>标签来设置ContentProvider
<provider      android:exported="true"      android:name="com.cx.datastored.MyContentProvider"      android:authorities="com.cx.datastored.MyContentProvider" ></provider>
注:android:exported="true"如果不设置,在本应用中访问数据时正常,但在其他应用中访问时就会出现异常。

5、在本应用中测试

package com.cx.mycontentdemo;import android.annotation.SuppressLint;import android.app.Activity;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends Activity {@SuppressLint("SdCardPath")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);insertRecord("user");        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() {    ContentResolver cr = getContentResolver();          String columns[] = new String[] { MyUsers.User._ID, MyUsers.User.USER_NAME };        Uri myUri = MyUsers.User.CONTENT_URI;        Cursor cur = cr.query(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_LONG).show();           } while (cur.moveToNext());       }    }}
6、在其他应用中测试,这里需要新建一个工程。
1)新建工程中创建一个与上面2相同的类
import android.net.Uri;import android.provider.BaseColumns;public class MyUsers {public static final String AUTHORITY = "com.cx.datastored.MyContentProvider";    //BaseColumn类中已经包含了 _id字段public static final class User implements BaseColumns {//定义uri        public static final Uri CONTENT_URI  = Uri.parse("content://com.cx.datastored.MyContentProvider");        // 表数据列        public static final String USER_NAME = "USER_NAME";    }}
2)测试代码也与5相同,只是他们是不同的应用
package com.cx.mycontentdemo;import android.annotation.SuppressLint;import android.app.Activity;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends Activity {@SuppressLint("SdCardPath")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);insertRecord("user");        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() {    ContentResolver cr = getContentResolver();          String columns[] = new String[] { MyUsers.User._ID, MyUsers.User.USER_NAME };        Uri myUri = MyUsers.User.CONTENT_URI;        Cursor cur = cr.query(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_LONG).show();           } while (cur.moveToNext());       }    }}
源码下载

测试应用源码

注意:只有在先运行了上面的应用后,再运行测试应用源码才会看到效果。
由于ContentProvider的主要用途是不同应用间的数据共享,所以在开发时很少会用到。例如,一个公司的一系列产品中的的某些数据需要相互使用。

文章参考:http://www.cnblogs.com/devinzhang/archive/2012/01/20/2327863.html

0 0