您的位置:首页 > 移动开发 > Android开发

Android攻城狮的第二门课(第3季)第4章 四大组件之ContentProvider

2017-08-24 15:11 381 查看
本章讲解Android中四大组件之一的ContentProvider,以及怎样通过contentProvider来实现进程间的数据共享功能

Android的四中数据存储方法:

1、SharedPreferences

2、SQLite

3、File

4、其他网络存储等

以上不可完成的任务(程序应用间的数据传递,跨程序处理数据)

都只是在单独的一个应用程序之中达到一个数据的共享。

通过的Uri访问实现增、删、该、查。

url是指通用资源标志符

content://com.imooc.provider/music/#

content:// 前缀表明数据受控于一个内容提供者。从不修改

com.imooc.provider 唯一标识 在AndroidMainfest.xml中注册

music 具体操作哪个条目

具体操作哪个条目下的哪个记录

UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH)
UriMatcher.NO_MATCH //表示不匹配任何路径的返回码
match.addURI("com.imooc.provider","music",1);
//匹配成功返回code值


ContentProvider数据分享

自己要些一个ContentProvider

package com.imooc.li806.ontentproviderdemo1;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

/**
* Created by li806 on 2017/8/24.
*/

public class MyContentProvider extends ContentProvider {

/比如你实现了增和删,第三方程序的能力只受限于你的ContentProvider。
@Override
//在ContetnProvider创建后被调用
public boolean onCreate() {
return false;
}

@Nullable
@Override
//根据uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列 以什么方式(order)排序
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
return null;
}

@Nullable
@Override
//返回当前uri的MIME类型,如果该URI对应的数据可能包括多条记录
//那么MIME类型字符串 就是以vnd.android.dir/开头
//  如果该URI对应的数据只有一条记录 该MIME类型字符串 就是以vnd.android.cursor.item/开头
public String getType(@NonNull Uri uri) {
return null;
}

@Nullable
@Override
//根据Uri插入Values对应的数据
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
return null;
}

@Override
//根据Uri删除selection指定的条件所匹配的全部记录
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}

@Override
//根据uri修改select
d0b1
ion指定的条件所匹配的全部记录
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
}


查询联系人的id和姓名

package com.imooc.li806.ontentproviderdemo1;

import android.content.ContentResolver;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.Contacts;

public class MainActivity extends AppCompatActivity {
//作用:查询系统联系人
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//使用系统提供好的ContentResolver
ContentResolver cr = getContentResolver();
//uri:Contacts.CONTENT_URI
//new String[] { Contacts._ID, Contacts.DISPLAY_NAME } 查询哪些列。
Cursor c = cr.query(Contacts.CONTENT_URI, new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, null, null, null);
if (c != null) {
while (c.moveToNext()) {
int id = c.getInt(c.getColumnIndex("_id"));
Log.i("info", "_id:" + id);
Log.i("info", "name:" + c.getString(c.getColumnIndex("display_name")));

//取号码   Phone.NUMBER 号码    Phone.TYPE 号码类型
//游标
Cursor c1 = cr.query(Phone.CONTENT_URI, new String[] {
Phone.NUMBER, Phone.TYPE },
Phone.CONTACT_ID + "=" + id, null, null);
// 根据联系人ID查询出联系人的电话号码
if (c1 != null) {
while (c1.moveToNext()) {
int type = c1.getInt(c1.getColumnIndex(Phone.TYPE));
if (type == Phone.TYPE_HOME) {
Log.i("info", "家庭电话:" + c1.getString(c1.getColumnIndex(Phone.NUMBER)));
} else if (type == Phone.TYPE_MOBILE) {
Log.i("info", "手机:" + c1.getString(c1.getColumnIndex(Phone.NUMBER)));
}
}
c1.close();
}
// 根据联系人的ID去查询出联系人的邮箱地址
Cursor c2 = cr.query(Email.CONTENT_URI, new String[] {
Email.DATA, Email.TYPE }, Email.CONTACT_ID + "=" + id, null, null);
if (c2 != null) {//一个人可能多个邮箱
while (c2.moveToNext()) {
int type = c2.getInt(c2.getColumnIndex(Email.DATA));
if (type == Email.TYPE_WORK) {
Log.i("info", "工作邮箱:" + c2.getString(c2.getColumnIndex(Email.DATA)));
}
}
c2.close();
}
}
c.close();
}
}

}


给通讯录中添加联系人

系统提供的ContentProvider

(1)查询联系人

(2)增加联系人

(3)短信的读取

(4)通话记录

(5)多媒体 (图片,视频,音频)

package com.imooc.contentproviderdemo2;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ContentResolver cr =  getContentResolver();
//向联系人中 插入一行数据
ContentValues values = new ContentValues();
Uri uri =  cr.insert(RawContacts.CONTENT_URI, values);
Long raw_contact_id = ContentUris.parseId(uri); //解析uri

values.clear();//清空values
//插入人名
values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);
values.put(StructuredName.DISPLAY_NAME, "张三三");
values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//插入的数据类型
uri = cr.insert(Data.CONTENT_URI, values);

//插入电话信息
values.clear();
values.put(Phone.RAW_CONTACT_ID,raw_contact_id);
values.put(Phone.NUMBER,"13333333333");
values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);//数据类型
uri = cr.insert(Data.CONTENT_URI, values);
}

}


记得给AndroidMainfest.xml加权限

<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: