Android中ContentProvider组件详解

xiaoxiao2021-02-28  76

ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

 

以下这段是Google Doc中对ContentProvider的大致概述。 内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

 

1.ContentProvider Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。 主要方法: public boolean onCreate() 在创建ContentProvider时调用 public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider,返回一个Cursor public Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中 public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据 public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据 public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型 *如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。 例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。 *如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。 例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"。

 

2.ContentResolver 当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。

[java]  view plain  copy ContentResolver cr = getContentResolver();   ContentResolver提供的方法和ContentProvider提供的方法对应的有以下几个方法。 public Uri  insert(Uri uri, ContentValues values) 用于添加数据到指定Uri的ContentProvider中。 public int  delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。 public int  update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。 public Cursor  query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查询指定Uri的ContentProvider。

 

3.Uri Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。 第一部分是"content://"。可以看作是网址中的"http://"。 第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如"blog.csdn.NET"。 第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

 

下面是用ContentProvider读取联系人数据,属于系统数据。完整代码下载:android_contentprovider_system.rar

注意:这里的联系人操作有点乱,关键是我还不是很熟,SDK1.6和SDK2.1的联系人操作很有很大不同,希望哪位大侠指点一下。

[java]  view plain  copy /**   * MainActivity   *    * @author zuolongsnail   */   public class MainActivity extends Activity {       private EditText nameET;       private EditText numberET;       private Button insertBtn;       private Button deleteBtn;       private Button queryBtn;       private ListView contentView;          @Override       public void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.main);           nameET = (EditText) findViewById(R.id.name);           numberET = (EditText) findViewById(R.id.number);           insertBtn = (Button) findViewById(R.id.insert);           deleteBtn = (Button) findViewById(R.id.delete);           queryBtn = (Button) findViewById(R.id.query);           // 用于显示数据           contentView = (ListView) findViewById(R.id.content);           insertBtn.setOnClickListener(new OperateOnClickListener());           deleteBtn.setOnClickListener(new OperateOnClickListener());           queryBtn.setOnClickListener(new OperateOnClickListener());       }          class OperateOnClickListener implements OnClickListener {           @Override           public void onClick(View v) {               String name = nameET.getText().toString();               String number = numberET.getText().toString();               Person p = new Person(name, number);               switch (v.getId()) {               // 插入数据               case R.id.insert:                   insert(p);                   view();                   break;               // 删除数据               case R.id.delete:                   delete(name);                   view();                   break;               // 查询数据               case R.id.query:                   view();                   break;               }           }       }          // 显示数据       private void view() {           Cursor c = query("");           ListAdapter listAdapter = new SimpleCursorAdapter(this, R.layout.list,                   c, new String[] { People._ID, People.NAME, People.NUMBER },                   new int[] { R.id.id, R.id.name, R.id.number });           contentView.setAdapter(listAdapter);       }          // 插入联系人       private void insert(Person p) {           // 获得ContentResolver对象           ContentResolver cr = getContentResolver();           ContentValues values = new ContentValues();           values.put(People.NAME, p.name);           // 表示是否把联系人添加到收藏(加星),1表示加入,0表示不加入,这行代码注释默认是不加入。           values.put(Contacts.People.STARRED, 1);           Uri uri = Contacts.People.createPersonInMyContactsGroup(cr, values);           // 获得联系人People表的Uri           Uri url = Uri.withAppendedPath(uri,                   Contacts.People.Phones.CONTENT_DIRECTORY);           values.clear();           values.put(Contacts.Phones.TYPE, Contacts.Phones.NUMBER);           values.put(Contacts.Phones.NUMBER, p.number);           // 插入操作           cr.insert(url, values);       }          // 插入联系人       private void delete(String name) {           // 获得ContentResolver对象           ContentResolver cr = getContentResolver();           Uri url = Contacts.People.CONTENT_URI;           // 设置删除条件           String where = People.NAME + "=?";           String[] selectionArgs = { name };           cr.delete(url, where, selectionArgs);       }          // 查询联系人       private Cursor query(String name) {           // 获得ContentResolver对象           ContentResolver cr = getContentResolver();           Uri uri = Contacts.People.CONTENT_URI;           // 查询对象           String[] projection = { People._ID, People.NAME, People.NUMBER };           // 设置查询条件,这里我把selection和selectionArgs参数都设为null,表示查询全部数据           String selection = null;           String[] selectionArgs = null;           if (!"".equals(name)) {               selection = People.NAME + "=?";               selectionArgs = new String[] { name };           }           // 设置排序条件           String sortOrder = Contacts.People._ID;           Cursor c = cr.query(uri, projection, selection, selectionArgs,                   sortOrder);           // if (c.moveToFirst()) {           // for (int i = 0; i < c.getCount(); i++) {           // c.moveToPosition(i);           // String name = c.getString(c.getColumnIndexOrThrow(People.NAME));           // String number = c.getString(c           // .getColumnIndexOrThrow(People.NUMBER));           // }           // }           return c;       }   }  

程序截图: 

转载请注明原文地址: https://www.6miu.com/read-60989.html

最新回复(0)