Android ContentProvider 应用程序间共享数据库

来源:互联网 发布:mac pink you think 编辑:程序博客网 时间:2024/05/22 13:18


闲来无事用下 ContentProvider

这是程序间共享数据的推荐途径(共享数据库);

比如通讯录软件就用了系统的共享的数据库;

废话少说:

要共享自己的数据库就得把自己整个的表结构以静态类的形式共享出来

第一步:

/** * 外部类和内部类正好对应了 数据库和表的关系,一个数据库下可以有多个表,所以可以在People下建多个内部类,类似Man类; * 而这个类的包结构正好唯一指定了这个表 */public final class People {public static final String AUTHORITY="com.nsw.android.provide.People";public static final String DB_NAME="People.db";public static final int VERSION=1;public static final  class Man implements BaseColumns{public static final String TABLE_NAME="Man";public static final Uri Content_URI=Uri.parse("content://"+AUTHORITY+"/"+TABLE_NAME);public static final String NAME="name";public static final String AGE="age";public static final String SEX="sex";}}

第二步:

/** * 跟你以前写的DB类类似,只不过继承了ContentProvider,在其方法中封装SQLiteDatabase的对象的增删查改 * 类里包含了一个SQLiteHelper的子类的引用 * 和一个UriMatcher (URI匹配器) * @author infinity * */public class MyProvider extends ContentProvider {/** * 这个变量相当一个URI的过滤器,来识别自己能处理的URI */private static final UriMatcher uriMatcher;private DBHelper dbHelper;static {//添加自己能处理的URIuriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(People.AUTHORITY, People.Man.TABLE_NAME, 0);}@Overridepublic boolean onCreate() {// TODO Auto-generated method stubdbHelper = new DBHelper(this.getContext(), People.DB_NAME, null,People.VERSION);return true;}@Overridepublic Uri insert(Uri arg0, ContentValues arg1) {// TODO Auto-generated method stub\SQLiteDatabase db = dbHelper.getWritableDatabase();long id = -1;switch (uriMatcher.match(arg0)) {case 0:id = db.insert(People.Man.TABLE_NAME, null, arg1);if (id > 0) {this.getContext().getContentResolver().notifyChange(arg0, null);return ContentUris.withAppendedId(People.Man.Content_URI, id);}break;}return null;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSQLiteQueryBuilder qb = new SQLiteQueryBuilder();SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor c = null;switch (uriMatcher.match(uri)) {case 0:qb.setTables(People.Man.TABLE_NAME);c = qb.query(db, projection, selection, selectionArgs, null, null,sortOrder);c.setNotificationUri(getContext().getContentResolver(), uri);break;}return c;}@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}@Overridepublic String getType(Uri arg0) {// TODO Auto-generated method stubreturn null;}/** * 因为一个程序只需要一个数据库 所以一一个内部类的形式实现 这DB类控制了程序的表结构,更新 *  * @author infinity *  */private class DBHelper extends SQLiteOpenHelper {public DBHelper(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL(String.format("create table %s ( %s integer primary key autoincrement ,%s varchar(10),%s varchar(10),%s varchar(2) ) ",People.Man.TABLE_NAME, People.Man._ID,People.Man.NAME, People.Man.AGE, People.Man.SEX));}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}}}

上边偷下了懒 只实现了 增加和查询,其他方法类似

第三部:
 注册Provider并把第一步中的类结构写入 android:authorities属性里
 <provider android:name="MyProvider"            android:authorities="com.nsw.android.provide.People"></provider>

完事,剩下就是再建一个工程,访问上面工程里的数据库了。
把第一步中People类考入 这工程的任意目录(想访问别人的数据库,你必须先知道表结构不是);

访问很简单
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ContentResolver cr=this.getContentResolver();//添加数据ContentValues cv=new ContentValues();cv.put(People.Man.NAME, "小倪");cv.put(People.Man.AGE, "23");cv.put(People.Man.SEX,"男");cr.insert(People.Man.Content_URI, cv);//查询数据    Cursor cs=cr.query(People.Man.Content_URI, new String[]{People.Man.NAME},"age = '23'", null, "age desc");TextView tv=(TextView) this.findViewById(R.id.tv);tv.setText(cs.getColumnCount()+"");}





原创粉丝点击