ContentProvite组件的使用
实例:
- activiy:
public class MainActivity extends AppCompatActivity {
private ListView MainActivity_listview;
private List<User> listdata=new ArrayList<>();
List<Map<String, Object>> listmap=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
getAllContacts2();
for (User user1:listdata){
Map<String,Object> map=new HashMap<>();
map.put("id",user1.get_id());
map.put("name",user1.getName());
map.put("phone",user1.getPhone());
listmap.add(map);
}
SimpleAdapter simpleAdapter=new SimpleAdapter(this,listmap,R.layout.listview_layout,new String[]{"name","phone"},new int[]{R.id.text1, R.id.text2});
MainActivity_listview.setAdapter(simpleAdapter);
// test();
}
//使用新版本完成查询
public void getAllContacts2(){
Uri uri=ContactsContract.Data.CONTENT_URI;
//所有的数据一般存在data1
//查询data1,mimetype_id,raw_contact_id
Cursor cursor=getContentResolver().query(uri,null,null,null,"display_name");
int index_contact_id=cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID);
int index_data1=cursor.getColumnIndex(ContactsContract.Data.DATA1);
int index_mimetype=cursor.getColumnIndex(ContactsContract.Data.MIMETYPE);
Log.i("data1",index_contact_id+"");
Log.i("data2",index_data1+"");
Log.i("data3",index_mimetype+"");
cursor.moveToFirst();
String id=cursor.getString(index_contact_id);
int tempid=Integer.parseInt(id);
User user=new User();
user.set_id(tempid);
do{
id=cursor.getString(index_contact_id);
if (Integer.parseInt(id)!=tempid){
listdata.add(user);
user=new User();
tempid=Integer.parseInt(id);
user.set_id(tempid);
}
String data1=cursor.getString(index_data1);
String mimetype=cursor.getString(index_mimetype);
//名称,字段名我是直接从数据库的mimetypes表复制的
if (mimetype.equals("vnd.android.cursor.item/name")){
user.setName(data1);
}
//电话
if (mimetype.equals("vnd.android.cursor.item/phone_v2")){
user.setPhone(data1);
}
}while(cursor.moveToNext());
listdata.add(user);
}
//使用老版本所公开的Uri完成查询
public void getAllContacts(){
ContentResolver cr=getContentResolver();
Uri uri=ContactsContract.Contacts.CONTENT_URI;
Uri Phoneuri=ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
Cursor cursor=cr.query(uri,null,null,null,null);
while (cursor.moveToNext()){
User user=new User();
String contact_id=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
user.set_id(Integer.parseInt(contact_id));
user.setName(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
Cursor Phonecursor=cr.query(Phoneuri,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?",new String[]{contact_id},null);
while (Phonecursor.moveToNext()){
user.setPhone(Phonecursor.getString(Phonecursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
listdata.add(user);
}
}
//测试
public void test(){
//1、ContentResolver
// ContentResolver cr=getContentResolver();
// //ContentResolver公开接口 insert, update, delete, query
// Uri uri= ContactsContract.Contacts.CONTENT_URI;//联系人名称
// Cursor cursor=cr.query(uri,new String[]{ContactsContract.Contacts.DISPLAY_NAME},null,null,null);
// while (cursor.moveToNext()){
// String name=cursor.getString(0);
// Log.i("PhoneName:",name);
// }
// ContentResolver cr1=getContentResolver();
// Uri uri1=ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
// Cursor cursor=cr1.query(uri1,new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},null,null,null);
// while (cursor.moveToNext()){
// String number=cursor.getString(0);
// Log.i("Phone:",number);
// }
ContentResolver cr=getContentResolver();
Uri uri=ContactsContract.Data.CONTENT_URI;//2.X以上版本可用
Cursor cursor=cr.query(uri,new String[]{ContactsContract.Data.DATA1},null,null,null);
while (cursor.moveToNext()){
String data1=cursor.getString(0);
Log.i("data1",data1);
}
}
private void initView() {
MainActivity_listview = (ListView) findViewById(R.id.MainActivity_listview);
}
}
- layout
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/MainActivity_listview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Name"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Phone"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
</LinearLayout>
自定义ContentProvider
- 自定义ContentProvider
- UriMatcher
编写一个类,必须继承自ContentProvider类
实现ContentProvider类中所有的抽象方法;
onCerate(),getType(),query(),insert(),update(),delete()等方法
在清单文件中声明注册ContentProvider
1、自定义创建数据库的类
package com.example.myapplication.util;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/*
* 自定义一个创建数据库的帮助类
* */
public class DBHelper extends SQLiteOpenHelper {
public static final int VERSION=1;
public DBHelper(Context context) {
//创建数据库
super(context,"Student.db",null,VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//创建数据库中的表
String sql="create table Student(_id integer primary key autoincrement,name,age,score)";
sqLiteDatabase.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
//修改数据库
}
}
2、创建自定义Provider类
package com.example.myapplication.util;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class MyProvider extends ContentProvider {
private DBHelper dbHelper;
@Override
public boolean onCreate() {
dbHelper=new DBHelper(getContext());
return false;
}
/*
*strings:查询的列
* s:行条件
* strings1:条件中参数的值
* s1:排序(排序字段)
*
* */
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
return dbHelper.getReadableDatabase().query("Student",strings,s,strings1,null,null,s1);
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
SQLiteDatabase sqLiteDatabase=dbHelper.getReadableDatabase();
long rowId = sqLiteDatabase.insert("Student", null, contentValues);
//追加一个id;就是在url后面加资源标识如:content://heying.provider.contentprovider/rowId
sqLiteDatabase.close();
return ContentUris.withAppendedId(uri,rowId);
}
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
return 0;
}
}
3、在AndroidManifest.xml中注册自定义的Provider
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<!-- 允许程序访问联系人通讯录信息-->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--注册provider;
authorities:相当于url我们自定定义的字符串;
name:自定义Provider的位置;
exported:为真就是允许别人访问-->
<provider
android:authorities="heying.provider.contentprovider"
android:name="com.example.myapplication.util.MyProvider"
android:exported="true"/>
</application>
</manifest>
使用
一)、本包MainActivity 的使用
package com.example.myapplication;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.myapplication.bean.User;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ListView MainActivity_listview;
private List<User> listdata = new ArrayList<>();
List<Map<String, Object>> listmap = new ArrayList<>();
private EditText textname;
private EditText textage;
private EditText textcj;
private Button butadd;
protected ContentResolver cr;
private Uri contenurl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
cr=getContentResolver();
contenurl= Uri.parse("content://heying.provider.contentprovider");
query();
}
private void initView() {
MainActivity_listview = (ListView) findViewById(R.id.MainActivity_listview);
textname = (EditText) findViewById(R.id.textname);
textname.setOnClickListener(this);
textage = (EditText) findViewById(R.id.textage);
textage.setOnClickListener(this);
textcj = (EditText) findViewById(R.id.textcj);
textcj.setOnClickListener(this);
butadd = (Button) findViewById(R.id.butadd);
butadd.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.butadd:
insert();
break;
}
}
private void query(){
Cursor cursor=cr.query(contenurl,null,null,null,null);
SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,R.layout.listview_layout,cursor,new String[]{"name","age","score"},
new int[]{R.id.text1,R.id.text2,R.id.text3});
MainActivity_listview.setAdapter(adapter);
}
private void insert() {
ContentValues values=new ContentValues();
values.put("name",textname.getText().toString().trim());
values.put("age",textage.getText().toString().trim());
values.put("score",textcj.getText().toString().trim());
cr.insert(contenurl, values);
Toast.makeText(this,"数据插入成功....",Toast.LENGTH_LONG).show();
query();
}
}
二)、其他应用程序的使用
注:只要知道其他包的共享的uri就可以拿到响应共享的数据。
package com.example.myapplication2;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private ListView main_listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
query();
}
private void query() {
Uri uri=Uri.parse("content://heying.provider.contentprovider");
Cursor cursor=getContentResolver().query(uri,null,null,null,null);
SimpleCursorAdapter simpleCursorAdapter=new SimpleCursorAdapter(this,R.layout.listview_layout,cursor,new String[]{"name","age","score"},
new int[]{R.id.text1,R.id.text2,R.id.text3});
main_listview.setAdapter(simpleCursorAdapter);
}
private void initView() {
main_listview = (ListView) findViewById(R.id.main_listview);
}
}
UriMatcher的使用(管理多个表的共享分区)
在自定义的ContentProvider为表设置资源标识:
使用matcher.match(uri);方法区分:
使用