Android之ContentProvite组件的使用

Android之ContentProvite组件的使用ContentProvi 组件的使用实例 activiy publicclassM privateListV lis

大家好,欢迎来到IT知识分享网。

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类

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);方法区分:

在这里插入图片描述

使用

在这里插入图片描述
在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/122485.html

(0)
上一篇 2025-10-16 12:26
下一篇 2025-10-16 12:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信