入门篇:9.组件4:ContentProvider(内容提供者)
Posted 安卓随笔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入门篇:9.组件4:ContentProvider(内容提供者)相关的知识,希望对你有一定的参考价值。
android 四大基本组件 的ContentProvider(内容提供者) 这个组件其实就是一个应用进行数据或数据库提供、共享其他应用获取数据的组件,其大致的结构图如下:
其中uri是一个重要的中间媒介。
联系到我们平时用的安卓程序,最常见的就是通讯录。在我们的安卓手机里,通讯录的设计其实是两个程序,其中有一个程序没有用户界面,单纯的存储着联系人信息,并且数据库结构复杂,这也是为了保证数据的安全。另外一个程序就是我们可以看见的通讯录程序。那么第一个程序就是一个ContentProvider,用于提供数据,而通讯录这个安卓手机内置软件,便是对ContentProvider所提供的程序进行增删改查。
如果我们想要自己写一个ContentProvider,就要自定义类去继承ContentProvider,并实现其中的方法,我们自定义的这个ContentProvider用于给其他应用或程序提供数据。这个类的具体结构和其中的方法代码如下,各个方法的含义在注释中可见:
import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.support.annotation.Nullable; /** * Created by lzc on 16/6/22. */ public class MyContentProvider extends ContentProvider { @Override public boolean onCreate() {//在创建ContentProvider时调用 return false; } @Nullable @Override public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {//根据uri查询出selection制定的条件所匹配的全部纪录,并且可以指定查询那些列以什么方式(order)排序 return null; } @Nullable @Override public String getType(Uri uri) {//返回当前uri的MIME类型,如果该uri对应的数据可能包括多条记录 //那么MIME类型字符串就是vnd.android.dir/开头 //如果该URI对应的数据只有一条记录,该MIME类型字符串就是 以vnd.android.crusor.item/开头 return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues contentValues) {//根据uri插入Values对应的纪录 return null; } @Override public int delete(Uri uri, String s, String[] strings) {//根据uri删除selection指定的条件所匹配的全部记录 return 0; } @Override public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {//根据uri修改selection指定的条件所匹配的全部记录 return 0; } }
这个ContentProvider在实际应用中我们不常去自己定义,更多的时候我们只是使用系统,或其他应用的ContentProvider。
这里写一个简单的应用,功能是实现查看手机内的通讯录信息。
代码如下:
import android.content.ContentResolver; import android.content.CursorLoader; import android.database.Cursor; import android.provider.ContactsContract; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ContentResolver cr = getContentResolver(); Cursor c = cr.query(ContactsContract.Contacts.CONTENT_URI,new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME},null,null,null); if(c!=null){ while(c.moveToNext()){ int id = c.getInt(c.getColumnIndex("_ID")); System.out.println("id="+id); String name = c.getString(c.getColumnIndex("DISPLAY_NAME")); System.out.println("name:"+name); Cursor c1 = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE}, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+id,null,null); if(c1!=null){ while (c1.moveToNext()){ int type = c1.getInt(c1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); if(type == ContactsContract.CommonDataKinds.Phone.TYPE_HOME) Log.i("info","家庭电话:"+c1.getString(c1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); else{ Log.i("info","手机:"+c1.getString(c1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); } } } c1.close(); } } c.close(); } }
注意:这里需要一个用户权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
在写一个简单的应用功能为在手机通讯录中插入一条信息。
代码如下:
import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.net.Uri; import android.provider.ContactsContract; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ContentResolver cr = getContentResolver(); //插入一行数据 ContentValues valuse = new ContentValues(); Uri uri = cr.insert(ContactsContract.RawContacts.CONTENT_URI,valuse); Long raw_contact_id = ContentUris.parseId(uri); valuse.clear(); //插入人名 valuse.put(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID,raw_contact_id); valuse.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,"安卓入门进阶"); valuse.put(ContactsContract.CommonDataKinds.StructuredName.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); uri = cr.insert(ContactsContract.Data.CONTENT_URI,valuse); //插入电话信息 valuse.clear(); valuse.put(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID,raw_contact_id); valuse.put(ContactsContract.CommonDataKinds.Phone.NUMBER,"131111111111"); valuse.put(ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); uri = cr.insert(ContactsContract.Data.CONTENT_URI,valuse); } }
注意:需要的用户权限为:
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
一般系统提供的ContentProvider包括:
-查询联系人
-增加联系人
-短信的读取
-通话记录
-多媒体 图片视频音频
至此,安卓开发的四大基本组件,大结局!
以上是关于入门篇:9.组件4:ContentProvider(内容提供者)的主要内容,如果未能解决你的问题,请参考以下文章