Android之使用Contentprovider对外共享数据和实现数据监听变化

来源:互联网 发布:java给文件夹重命名 编辑:程序博客网 时间:2024/05/21 06:56

 

 

总结:

 

 

     当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:

public class PersonContentProvider extendsContentProvider{

  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)}

第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities就是他的域名:

<manifest .... >

   <application android:icon="@drawable/icon"android:label="@string/app_name">

       <provider android:name=".PersonContentProvider"android:authorities="cn.itcast.provider.personprovider"/>

   </application>

</manifest>

注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。

 

 

 

 

ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://

主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

要操作person表中id10的记录,可以构建这样的路径:/person/10

要操作person表中id10的记录的name字段, person/10/name

要操作person表中的所有记录,可以构建这样的路径:/person

要操作xxx表中的记录,可以构建这样的路径:/xxx

当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等他存储方式,如下:

要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri =Uri.parse("content://cn.itcast.provider.personprovider/person")

使用ContentResolverContentProvider中的数据进行添加、删除、修改和查询操作:

ContentResolver resolver =  getContentResolver();

Uri uri =Uri.parse("content://cn.itcast.provider.personprovider/person");

//添加一条记录

ContentValues values = new ContentValues();

values.put("name","itcast");

values.put("age", 25);

resolver.insert(uri, values);          

//获取person表中所有记录

Cursor cursor = resolver.query(uri, null,null, null, "personid desc");

while(cursor.moveToNext()){

       Log.i("ContentTest","personid="+ cursor.getInt(0)+ ",name="+cursor.getString(1));

}

//id1的记录的name字段值更改新为liming

ContentValues updateValues = newContentValues();

updateValues.put("name","liming");

Uri updateIdUri =ContentUris.withAppendedId(uri, 2);

resolver.update(updateIdUri, updateValues,null, null);

//删除id2的记录

Uri deleteIdUri = ContentUris.withAppendedId(uri,2);

resolver.delete(deleteIdUri, null, null);

 

 

 

 

ContentUris类用于获取Uri路径后面的ID部分,它有两个比较实用的方法:

withAppendedId(uri, id)用于为路径加上ID部分:

Uri uri =Uri.parse("content://cn.itcast.provider.personprovider/person")

Uri resultUri =ContentUris.withAppendedId(uri, 10);

//生成后的Uri为:content://cn.itcast.provider.personprovider/person/10

 

parseId(uri)方法用于从路径中获取ID部分:

Uri uri =Uri.parse("content://cn.itcast.provider.personprovider/person/10")

long personid = ContentUris.parseId(uri);//获取的结果为:10

 

 

 

 

 

1 基本的代码

package cn.csdn.hr.db;

 

import cn.csdn.hr.service.DBOpenHelper;

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;

 

public class PersonContentProvider extendsContentProvider {

 

       //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码

       privatestatic final UriMatcher sMatcher = new UriMatcher(

                     UriMatcher.NO_MATCH);

       privatestatic final int PERSONS = 1;

       privatestatic final int PERSON = 2;

       privateDBOpenHelper dbOpenHelper;

       static{

              //如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为1

              sMatcher.addURI("cn.csdn.hr.personprovider","person", PERSONS);

              sMatcher.addURI("cn.csdn.hr.personprovider","person#",PERSON);

       }

 

       //content//cn.csdn.hr.personprovider

       @Override

       publicUri insert(Uri uri, ContentValues values) {

              //获去数据的事例话操作

              SQLiteDatabasedb = dbOpenHelper.getWritableDatabase();

              switch(sMatcher.match(uri)) {

              casePERSONS:

                     longrowid = db.insert("person", "name", values);

                     /*

                      * withAppendedId(uri, id)用于为路径加上ID部分: Uri uri =

                      *Uri.parse("content://cn.itcast.provider.personprovider/person")

                      * Uri resultUri =ContentUris.withAppendedId(uri, 10);

                      * //生成后的Uri为:content://cn.itcast.provider.personprovider/person/10

                      */

                     returnContentUris.withAppendedId(uri, rowid);

 

              default:

                     thrownew IllegalArgumentException("UNkown uri" + uri);

 

              }

 

       }

 

       //content//cn.csdn.hr.personprovider/person删除表中的所有记录

       //content//cn.csdn.hr.personprovider/person/10删除表中的指定ID的记录

       @Override

       publicint delete(Uri uri, String selection, String[] selectionArgs) {

              //获去数据的事例话操作

              SQLiteDatabasedb = dbOpenHelper.getWritableDatabase();

              intnum = 0;

              switch(sMatcher.match(uri)) {

              casePERSONS:

                     num= db.delete("person", selection, selectionArgs);

                     break;

 

              casePERSON:

                     longpersonid = ContentUris.parseId(uri);

                     Stringwhere = "personid" + personid;

                     if(selection != null && "".equals(selection)) {

                            where= where + " and " + selection;

                     }

 

                     num= db.delete("person", where, selectionArgs);

                     break;

              default:

                     thrownew IllegalArgumentException("UNkown uri" + uri);

              }

              returnnum;

       }

 

       @Override

       publicString getType(Uri uri) {

              switch(sMatcher.match(uri)) {

              casePERSONS:

                     return"vnd.android.cursor.dir/person";

 

              casePERSON:

                     return"vnd.android.cursor.item/person";

              default:

                     thrownew IllegalArgumentException("UNkown uri" + uri);

                     }

       }

 

       @Override

       publicboolean onCreate() {

              //进行初始化

              dbOpenHelper= new DBOpenHelper(this.getContext());

              returntrue;

       }

       //content//cn.csdn.hr.personprovider/person查询表中的所有记录

                     //content//cn.csdn.hr.personprovider/person/10查询表中的指定ID的记录

       @Override

       publicCursor query(Uri uri, String[] projection, String selection,

                     String[]selectionArgs, String sortOrder) {

              SQLiteDatabasedb = dbOpenHelper.getReadableDatabase();

             

              switch(sMatcher.match(uri)) {

              casePERSONS:

                     returndb.query("person", projection, selection, selectionArgs, null, null,sortOrder);

                    

 

              casePERSON:

                     //获取ID

                     longpersonid = ContentUris.parseId(uri);

                     Stringwhere = "personid" + personid;

                     //如果有外部的条件

                     if(selection != null && "".equals(selection)) {

                            where= where + " and " + selection;

                     }

                     returndb.query("person", projection, where, selectionArgs, null, null,sortOrder);

                    

                    

              default:

                     thrownew IllegalArgumentException("UNkown uri" + uri);

              }

             

       }

       //content//cn.csdn.hr.personprovider/person更新表中的所有记录

              //content//cn.csdn.hr.personprovider/person/10更新表中的指定ID的记录

       @Override

       publicint update(Uri uri, ContentValues values, String selection,

                     String[]selectionArgs) {

              //获去数据的事例话操作

                            SQLiteDatabasedb = dbOpenHelper.getWritableDatabase();

                            intnum = 0;

                            switch(sMatcher.match(uri)) {

                            casePERSONS:

                                   num= db.update("person", values, selection, selectionArgs);

                                   break;

 

                            casePERSON:

                                   //获取ID

                                   longpersonid = ContentUris.parseId(uri);

                                   Stringwhere = "personid" + personid;

                                   //如果有外部的条件

                                   if(selection != null && "".equals(selection)) {

                                          where= where + " and " + selection;

                                   }

 

                                   num =db.update("person", values,where, selectionArgs);

                                   break;

                            default:

                                   thrownew IllegalArgumentException("UNkown uri" + uri);

                            }

                            returnnum;

       }

 

}

 

 

 

 

测试方法的应用

 

package cn.csdn.hr.activity;

 

import android.content.ContentResolver;

import android.content.ContentValues;

import android.database.Cursor;

import android.net.Uri;

import android.test.AndroidTestCase;

import android.util.Log;

 

public class AccessContentProvider extendsAndroidTestCase {

       privatestatic final String TAG="AccessContentProvider";

       publicvoid testSave() throws Throwable{

              ContentResolvercontentResolver = this.getContext().getContentResolver();

              UriinsertUri = Uri.parse("content://cn.csdn.hr.personprovider/person");

              ContentValuesvalues = new ContentValues();

              values.put("name","laozhang");

              values.put("phone","1350000009");

              values.put("amount","30000000000");

              Uriuri = contentResolver.insert(insertUri, values);

              Log.i(TAG,uri.toString());

       }publicvoid testUpdate() throws Throwable{

              ContentResolvercontentResolver = this.getContext().getContentResolver();

              UriupdateUri =Uri.parse("content://cn.csdn.hr.personprovider/person/5");

              ContentValuesvalues = new ContentValues();

              values.put("amount","300");

              contentResolver.update(updateUri,values, null, null);

       }

      

       publicvoid testFind() throws Throwable{

              ContentResolvercontentResolver = this.getContext().getContentResolver();

              Uriuri = Uri.parse("content://cn.csdn.hr.personprovider/person");

              Cursorcursor = contentResolver.query(uri, null, null, null, "personidasc");

              while(cursor.moveToNext()){

                     intpersonid = cursor.getInt(cursor.getColumnIndex("personid"));

                     Stringname = cursor.getString(cursor.getColumnIndex("name"));

                     Stringphone = cursor.getString(cursor.getColumnIndex("phone"));

                     intamount = cursor.getInt(cursor.getColumnIndex("amount"));

                     Log.i(TAG,"personid="+ personid + ",name="+ name+",phone="+ phone+ ",amount="+ amount);

              }

              cursor.close();

       }

      

       publicvoid testDelete() throws Throwable{

              ContentResolvercontentResolver = this.getContext().getContentResolver();

              Uriuri = Uri.parse("content://cn.csdn.hr.personprovider/person/5");

              contentResolver.delete(uri,null, null);

       }

}

 

原创粉丝点击