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
);
}
public void getAllContacts2(){
Uri uri
=ContactsContract
.Data
.CONTENT_URI
;
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
);
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
);
}
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(){
ContentResolver cr
=getContentResolver();
Uri uri
=ContactsContract
.Data
.CONTENT_URI
;
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
自定义ContentProviderUriMatcher
编写一个类,必须继承自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;
}
@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
);
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);方法区分:
使用