Android之ContentProvider

获取联系人列表:

通过getContentResolver()获取CntentResolver实例。

然后调用query()方法传入获取手机联系的Uri:

ContactsContract.CommonDataKinds.Phone.CONTENT_URI

其中query()方法由五个参数,

第一个为Uri目标对象,

第二个为制定查询的列名,

第三个为指定where的约束条件,

第四个参数为为where中的占位符提供具体的值,

第五个参数是查询结果的排列顺序。

获得一个Cursor实例,再循环调用moveToNext()方法遍历所有数据。


在每一次循环中Cursor通过调用getString()方法传入索引获取数据。


而索引又通过getColumnIndex()方法传入对应的列名获得。

android.content.ContentResolver

    private void readContect(){
        Cursor cursor=null;
        cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
        if(cursor!=null){
            while(cursor.moveToNext()){
                String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                list.add(name+"\n"+number);
            }
            arrayAdapter.notifyDataSetChanged();
        }
    }


以下代码涉及到动态权限的申请和ArrayAdapter的使用。

demo:

import android.Manifest;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private ArrayAdapter<String> arrayAdapter;
    private Button button;
    private ListView listView;
    private List<String> list=new ArrayList<>();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                listView=(ListView)findViewById(R.id.listView);
                arrayAdapter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,list);
                listView.setAdapter(arrayAdapter);
                if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
                }else{
                    readContect();
                }
            }
        });
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch(requestCode){
            case 1:
                if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    readContect();
                }else{
                    Toast.makeText(MainActivity.this,"无法获得相关权限",Toast.LENGTH_SHORT).show();
                }
                break;

        }
    }
    private void readContect(){
        Cursor cursor=null;
        cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
        if(cursor!=null){
            while(cursor.moveToNext()){
                String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                list.add(name+"\n"+number);
            }
            arrayAdapter.notifyDataSetChanged();
        }
    }
}

在AndroidManefist.xml中要添加权限

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


创建自己的内容提供器:


创建一个继承ContentProvider的类,重写里面的onCreate,query,update,insert,delete,getType方法。

query第一个参数为要查询内容对应的Uri,第二个参数为要查询的列名,第三个参数为指定where的约束条件如"where name=?",第四个参数为指定where的占位符提供的具体值如new String[]{"grooter"},第五个参数为查询结果的排列顺序。返回Cursor对象。

其中update的第二个参数为要更新的数据,如values.put("price",10)指的是更新价格为10,第三个参数和第四个参数同query的第三和第四个参数,如"name=?",new String[]{"数据结构"}将数据结构这本书的价格改为10。返回的是受影响的行数。

delete的第二和第三个参数同update的第三和第四个参数。返回的是被删除的行数。

insert的第二个参数是要插入的数据。返回新记录的URI。

android.content.ContentValues

android.content.ContentProvider

内容提供端:

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 Administrator on 2017/11/7.
 */

public class MyProvider extends ContentProvider {

    @Override
    public boolean onCreate() {
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
        return null;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }
}

内容请求端:

Uri uri=Uri.parse("content://com.example.databasetest.provider/book");

Cursor cursor=getContentResolver().query(uri,null,null,null,null);

com.example.databasetest.provider为内容提供器定制的uri,book指数据库中的表

当拿到cursor后,就可以遍历出数据,详见取联系人目录demo




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值