android:authorities="com.lzb.provide.myContentProvide"
android:name=".MyContentProvide"
android:exported="true">
属性authorities是Uri标识,ContentProvide就是以这个Uri的形式对外提供数据,ContentResolve也是根据该Uri进行访问操作该应用的数据的,可以理解为网站的域名;属性exported指定是否对外暴露数据,只有为true时,其他应用才可以访问该应用的数据;属性name指定ContentProvide实现类的类名;
public boolean onCreate()
说明:该方法在ContentProvider创建后会被调用,当其他应用程序第一次访问ContentProvide时,该ContentProvider会被创建出来,并立即回调该onCreate方法
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
说明:根据Uri查询出select条件所匹配的全部记录,projection表示一个列名列表,表明只选择指定的数据列
public String getType(Uri uri)
说明:返回 当前Uri所代表的数据的MIME类型。如果该Uri对应数据可能包括多条记录,那么MIME类型字符串应该以 vnd.android.cursor.dir/开头;如果该Uri对应的数据只包含一条记录,那么返回MIME类型字符串应该以vnd.android.cursor.item/开头。
public Uri insert(Uri uri, ContentValues values)
说明:根据该Uri插入values对应的数据
public int delete(Uri uri, String selection, String[] selectionArgs)
说明:根据Uri,删除selection条件匹配全部记录。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
说明:根据Uri,更新selection条件匹配的记录。
https://www.oracle.com/index.html
content://com.lzb.provide.myContentProvide/students
这个也是固定的。为了保证URI标识的唯一性,它一般是一个完整的、小写的类名(包.小写的类名);
我们知道网站的Uri都有个默认的端口8080,其实我也可以给ContentProvider添加端口,其规则如下:
content://com.example.project:200/folder/subfolder/etc\---------/ \---------------------------/ \---/\--------------------------/scheme host port path\--------------------------------/authority
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
说明:根据Uri查询出select条件所匹配的全部记录,projection表示一个列名列表,表明只选择指定的数据列
public Uri insert(Uri uri, ContentValues values)
说明:根据该Uri插入values对应的数据
public int delete(Uri uri, String selection, String[] selectionArgs)
说明:根据Uri,删除selection条件匹配全部记录。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
说明:根据Uri,更新selection条件匹配的记录。
那么ContentProvider、Uri、ContentResolver之间的关系是如何的呢?如下关系图:
五 UriMatcher类
public void addURI(String authority, String path, int code)
说明:该方法用于向UriMatcher注册Uri,其中参数authority与path组成一个Uri,参数code 是该Uri对应的标识码
例如:
/**标识码*/
public static final int CODE_ID_1 = 1;
public static final int CODE_ID_2 = 2;
public static final String HOST = "com.lzb.provide.myContentProvide";
/**路径*/
public static final String PATH = "students";
/**初始化UriMatcher工具类*/
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
// # 为通配符
uriMatcher.addURI(HOST,PATH,CODE_ID_1);
uriMatcher.addURI(HOST,PATH + "/#",CODE_ID_2);
}
public int match(Uri uri)
说明:根据前面注册的Uri返回其对应的标识码,如果在UriMatcher中找不到对应的Uri则返回-1。
例如上述示例注册了content://com.lzb.provide.myContentProvide:200/students 与content://com.lzb.provide.myContentProvide:200/students/#。
那么 若Uri为content://com.lzb.provide.myContentProvide:200/student返回1,若Uri为content://com.lzb.provide.myContentProvide:200/students/1(或者2,3,4.....)返回2,否则的话返回-1。
public static Uri withAppendedId(Uri uri, long id) 用于为路径加上id部分
例如:Uri uri = Uri.parse("content://com.lzb.provide.myContentProvide:200/students");
Uri newUri = ContentUris.withAppendedId(uri,2);
那么 newUri 就变成了content://com.lzb.provide.myContentProvide:200/students/2。
public static long parseId(Uri uri) 用于从指定的Uri中解析出所包含的id
//读取系统短信
Uri uri=Uri.parse(
"content://sms/inbox"
);
Cursor cursor=getContentResolver().query(uri,
new
String[]{
"address"
,
"body"
},
null
,
null
,
null
);
while
(cursor.moveToNext()){
Log.e(
"短信"
, cursor.getString(
0
)+
" "
+cursor.getString(
1
));
}
//向系统中写入短信
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse(
"content://sms/inbox"
);
ContentValues values =
new
ContentValues();
values.put(
"address"
,
"95558"
);
values.put(
"body"
,
"尊敬的xxx,你尾号为xxxx的招商银行卡入账....."
);
values.put(
"type"
,
1
);
values.put(
"person"
,
"招商银行"
);
values.put(
"read"
,
0
);
resolver.insert(uri, values);
2 访问手机联系人
Android系统提供了Contacts应用程序来管理联系人,而且还为联系人提供了ContentProvider,所以其他应用程序也可以来管理联系人。
Uri uri1 = Uri.parse(
"content://com.android.contacts/raw_contacts"
);
Uri uri2 = Uri.parse(
"content://com.android.contacts/data/phones"
);
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri1,
new
String[]{
"contact_id"
,
"display_name"
},
null
,
null
,
null
);
while
(cursor.moveToNext()){
int
contact_id = cursor.getInt(cursor.getColumnIndex(
"contact_id"
));
String name = cursor.getString(cursor.getColumnIndex(
"display_name"
));
Cursor cursor2 = resolver.query(uri2,
new
String[]{
"data1"
},
"raw_contact_id=?"
,
new
String[]{contact_id+
""
},
null
);
while
(cursor2.moveToNext()){
//int mimetype_id = cursor2.getInt(cursor2.getColumnIndex("mimetype"));
String data1 = cursor2.getString(cursor2.getColumnIndex(
"data1"
));
Log.e(
"联系人..."
, data1);
}
}