安卓学习-ContentProvider-调用ContentProvider-使用ContentProvider访问联系人

image

image

image

image

image

image

案例:imageimage

//Person.java

package com.example.administrator.contentprovider;

/**
* Created by Administrator on 2016/4/4.
*/
public class Person {
private int id;
private String name;
private int age;
public Person()
{

}

public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"age=" + age +
", id=" + id +
", name='" + name + '\'' +
'}';
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

PersonMetadata.java

package com.example.administrator.contentprovider;

import android.provider.BaseColumns;

/**
* Created by Administrator on 2016/4/4.
*/
//finale 不让继承
public final class PersonMetadata {
public static abstract class Person implements BaseColumns {
public static final String TABLE_NAME="person";
public static final String NAME="name";
public static final String AGE="age";
}
}

DatabaseAdapter.java

package com.example.administrator.contentprovider;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.lang.reflect.Array;
import java.util.ArrayList;

/**
* Created by Administrator on 2016/4/4.
*/
public class DatabaseAdapter {
private DatabaseHelper dbHelper;

public DatabaseAdapter(Context context) {
dbHelper = new DatabaseHelper(context);
}

public void save(Person person) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(PersonMetadata.Person.NAME, person.getName());
values.put(PersonMetadata.Person.AGE, person.getAge());
db.insert(PersonMetadata.Person.TABLE_NAME, null, values);
db.close();
}

public void delete(int id) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
String whereClause = PersonMetadata.Person._ID + "=?";
String[] whereArgs = {String.valueOf(id)};
db.delete(PersonMetadata.Person.TABLE_NAME, whereClause, whereArgs);
db.close();
}

public void update(Person person) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(PersonMetadata.Person.NAME, person.getName());
values.put(PersonMetadata.Person.AGE, person.getAge());
String whereClause = PersonMetadata.Person._ID + "=?";
String[] whereArgs = {String.valueOf(person.getId())};
db.update(PersonMetadata.Person.TABLE_NAME, values, whereClause, whereArgs);
db.close();
}
public ArrayList<Person> findAll()
{
SQLiteDatabase db= dbHelper.getReadableDatabase();
Cursor c=db.query(PersonMetadata.Person.TABLE_NAME, null, null, null, null, null, null);
ArrayList<Person> list=new ArrayList<Person>();
Person person=null;
while (c.moveToNext())
{
person=new Person();
person.setId(c.getInt(c.getColumnIndexOrThrow(PersonMetadata.Person._ID)));
person.setName(c.getString(c.getColumnIndexOrThrow(PersonMetadata.Person.NAME)));
person.setAge(c.getInt(c.getColumnIndexOrThrow(PersonMetadata.Person.AGE)));
list.add(person);
}
c.close();
db.close();
return list;
}
public Person findById(int id)
{
SQLiteDatabase db= dbHelper.getReadableDatabase();
Cursor c=db.query(PersonMetadata.Person.TABLE_NAME, null, PersonMetadata.Person._ID+"=?", new String[]{String.valueOf(id)}, null, null, null);

Person person=null;
if (c.moveToNext())
{
person=new Person();
person.setId(c.getInt(c.getColumnIndexOrThrow(PersonMetadata.Person._ID)));
person.setName(c.getString(c.getColumnIndexOrThrow(PersonMetadata.Person.NAME)));
person.setAge(c.getInt(c.getColumnIndexOrThrow(PersonMetadata.Person.AGE)));

}
c.close();
db.close();
return person;
}


public static class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "cp.db";
private static final int VERSION = 1;
private static final String CREATE_TABLE = "CREATE TABLE person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT,age INT)";
private static final String DROP_TABLE = "DROP TABLE IF EXISTS person";

public DatabaseHelper(Context context) {
super(context, DB_NAME, null, VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_TABLE);
db.execSQL(CREATE_TABLE);
}
}

}

HelloContentProvider.java

先在清单文件中注册:

<provider
android:authorities="com.example.administrator.contentprovider.hellocontentprovider"
android:name=".HelloContentProvider"></provider>
----------------------------------------------------------------------------------------
package com.example.administrator.contentprovider;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

/**
* 自定义内容提供者
* Created by Administrator on 2016/4/4.
*/
public class HelloContentProvider extends ContentProvider {
private static final String AUTHORITY = "com.example.administrator.contentprovider.hellocontentprovider";
//创建一个URI的匹配器
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int SINGLE_CODE = 2;//返回单个记录的匹配码
private static final int MUTIPLE_CODE = 1;//标识返回多个记录的匹配码
//text/plain image/jpg
private static final String SINGLE_TYPE = "vnd.android.cursor.item/person";
private static final String MUTIPLE_TYPE = "vnd.android.cursor.dir/person";

static {
//content://com.example.administrator.contentprovider.hellocontentprovider/person

uriMatcher.addURI(AUTHORITY, "person", MUTIPLE_CODE);
//content://com.example.administrator.contentprovider.hellocontentprovider/person/1
uriMatcher.addURI(AUTHORITY, "person/#", SINGLE_CODE);
}

private DatabaseAdapter.DatabaseHelper dbHelper;

@Override
public boolean onCreate() {
dbHelper = new DatabaseAdapter.DatabaseHelper(getContext());
return true;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
switch (uriMatcher.match(uri)) {
case SINGLE_CODE:
SQLiteDatabase db = dbHelper.getReadableDatabase();
long id = ContentUris.parseId(uri);
selection = PersonMetadata.Person._ID + "=?";
selectionArgs = new String[]{String.valueOf(id)};
return db.query(PersonMetadata.Person.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);

case MUTIPLE_CODE:
db = dbHelper.getReadableDatabase();

return db.query(PersonMetadata.Person.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);

}
return null;
}

@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case SINGLE_CODE:
return SINGLE_TYPE;
case MUTIPLE_CODE:
return MUTIPLE_TYPE;
}
return null;
}

//content://com.example.administrator.contentprovider.hellocontentprovider/person
@Override
public Uri insert(Uri uri, ContentValues values) {
switch (uriMatcher.match(uri)) {
case MUTIPLE_CODE:
SQLiteDatabase db = dbHelper.getWritableDatabase();
long id = db.insert(PersonMetadata.Person.TABLE_NAME, null, values);
uri = ContentUris.withAppendedId(uri, id);
db.close();
break;
}
return uri;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
switch (uriMatcher.match(uri))
//content://com.example.administrator.contentprovider.hellocontentprovider/person/1
{
case SINGLE_CODE:
SQLiteDatabase db = dbHelper.getWritableDatabase();
long id = ContentUris.parseId(uri);
selection = PersonMetadata.Person._ID + "=?";
selectionArgs = new String[]{String.valueOf(id)};
int row = db.delete(PersonMetadata.Person.TABLE_NAME, selection, selectionArgs);
db.close();
return row;
case MUTIPLE_CODE:
db = dbHelper.getWritableDatabase();
row = db.delete(PersonMetadata.Person.TABLE_NAME, selection, selectionArgs);
db.close();
return row;
}
return 0;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
switch (uriMatcher.match(uri))
//content://com.example.administrator.contentprovider.hellocontentprovider/person/1
{
case SINGLE_CODE:
SQLiteDatabase db = dbHelper.getWritableDatabase();
long id = ContentUris.parseId(uri);
selection = PersonMetadata.Person._ID + "=?";
selectionArgs = new String[]{String.valueOf(id)};
int row = db.update(PersonMetadata.Person.TABLE_NAME, values, selection, selectionArgs);
db.close();
return row;
case MUTIPLE_CODE:
db = dbHelper.getWritableDatabase();
row = db.update(PersonMetadata.Person.TABLE_NAME, values, selection, selectionArgs);
db.close();
return row;
}
return 0;
}
}
 
 

MainActivity.java

package com.example.administrator.contentprovider;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void addClick(View view) {
ContentResolver cr = this.getContentResolver();
//content://com.example.administrator.contentprovider.hellocontentprovider/person/1
//content://com.example.administrator.contentprovider.hellocontentprovider/person
//调用ContentProvider的添加方法
Uri uri = Uri.parse("content://com.example.administrator.contentprovider.hellocontentprovider/person");

ContentValues values = new ContentValues();
values.put(PersonMetadata.Person.NAME, "xiaofei");
values.put(PersonMetadata.Person.AGE, 18);
cr.insert(uri, values);
}

public void deleteClick(View view) {
ContentResolver cr = this.getContentResolver();
Uri uri = Uri.parse("content://com.example.administrator.contentprovider.hellocontentprovider/person/1");
cr.delete(uri, null, null);
}

public void updateClick(View view) {
ContentResolver cr = this.getContentResolver();
Uri uri = Uri.parse("content://com.example.administrator.contentprovider.hellocontentprovider/person/1");
ContentValues values = new ContentValues();
values.put(PersonMetadata.Person.NAME, "xiaolong");
values.put(PersonMetadata.Person.AGE, 20);
cr.update(uri, values, null, null);
}

public void queryClick(View view) {
ContentResolver cr = this.getContentResolver();
Uri uri = Uri.parse("content://com.example.administrator.contentprovider.hellocontentprovider/person");
Cursor c = cr.query(uri, null, null, null, null);
while (c.moveToNext()) {
System.out.println(c.getInt(c.getColumnIndexOrThrow(PersonMetadata.Person._ID)));
System.out.println(c.getString(c.getColumnIndexOrThrow(PersonMetadata.Person.NAME)));
System.out.println(c.getInt(c.getColumnIndexOrThrow(PersonMetadata.Person.AGE)));
}
c.close();

}

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.contentprovider.MainActivity">

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="add"
android:onClick="addClick"
android:id="@+id/add"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="delete"
android:onClick="deleteClick"
android:id="@+id/button"
android:layout_below="@+id/add"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="update"
android:onClick="updateClick"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="query"
android:onClick="queryClick"
android:id="@+id/button3"
android:layout_below="@+id/button2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button2"
android:layout_alignEnd="@+id/button2" />
</RelativeLayout>

 

image

案例:访问联系人

image

image

image

image

image

 

imageimage

先增加权限

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

activity_contacts.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.contentprovider.ContactsActivity">

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加联系人"
android:onClick="addClick"
android:id="@+id/button4"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除联系人"
android:onClick="deleteClick"
android:id="@+id/button5"
android:layout_below="@+id/button4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="修改联系人"
android:onClick="updateClick"
android:id="@+id/button6"
android:layout_below="@+id/button5"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询联系人"
android:onClick="queryClick"
android:id="@+id/button7"
android:layout_below="@+id/button6"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>

 

ContactsActivity.java

package com.example.administrator.contentprovider;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Toast;

public class ContactsActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
}
public void addClick(View view)
{
ContentResolver cr=getContentResolver();
//执行一个空值插入,目的是获取系统返回的rawContactId
ContentValues values=new ContentValues();
Uri uri=cr.insert(ContactsContract.RawContacts.CONTENT_URI,values);
long _id= ContentUris.parseId(uri);
//插入姓名数据
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, _id);
values.put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,"xiaoyao");
cr.insert(ContactsContract.Data.CONTENT_URI,values);
//插入电话数据
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, _id);
values.put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,"0099");
values.put(ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
cr.insert(ContactsContract.Data.CONTENT_URI, values);
Toast.makeText(this,"记录已添加",Toast.LENGTH_LONG).show();




}
//删除联系人
public void deleteClick(View view)
{
ContentResolver cr=getContentResolver();
System.out.println(ContactsContract.Contacts.CONTENT_URI.toString()+"/4");
Uri uri=Uri.parse("content://com.android.contacts/contacts/4");
cr.delete(uri,null,null);
Toast.makeText(this,"记录已删除",Toast.LENGTH_SHORT).show();

}
//修改联系人
public void updateClick(View view)
{

ContentResolver cr=getContentResolver();
ContentValues values=new ContentValues();
values.put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,"4445");
values.put(ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
cr.update(ContactsContract.Data.CONTENT_URI, values, "_id=1", null);
Toast.makeText(this,"_id=1的记录已更新",Toast.LENGTH_SHORT).show();

}
//查询联系人
public void queryClick(View view)
{

ContentResolver contentResolver=this.getContentResolver();
String id=null;
String mimetype=null;
//只需要从Contacts中获取ID,其他的都可以不要,通过查看上面编译后的SQL语句,可以看出
//将第二个参数设置为Null,默认返回的列非常多,是一种资源浪费。
Cursor cursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,
new String[]{android.provider.ContactsContract.Contacts._ID},null,null,null);
while (cursor.moveToNext())
{
id=cursor.getString(cursor.getColumnIndexOrThrow(android.provider.ContactsContract.Contacts._ID));
//从一个Cursor获取所有的信息
Cursor contactInfoCursor=contentResolver.query(ContactsContract.Data.CONTENT_URI,
new String[]{android.provider.ContactsContract.Data.CONTACT_ID,
android.provider.ContactsContract.Data.MIMETYPE,
android.provider.ContactsContract.Data.DATA1,
android.provider.ContactsContract.Data.DATA15},
android.provider.ContactsContract.Data.CONTACT_ID+"="+id,
null,null);

while (contactInfoCursor.moveToNext())
{
mimetype=contactInfoCursor.getString(contactInfoCursor.getColumnIndexOrThrow(android.provider.ContactsContract.Data.MIMETYPE));
String value=contactInfoCursor.getString(contactInfoCursor.getColumnIndexOrThrow(android.provider.ContactsContract.Data.DATA1));
byte[] photo=contactInfoCursor.getBlob(contactInfoCursor.getColumnIndexOrThrow(android.provider.ContactsContract.Data.DATA15));
if (mimetype.contains("/name"))
{
System.out.println("姓名="+value);
}
else if(mimetype.contains("/im"))
{
System.out.println("聊天(QQ)账号="+value);
}
else if(mimetype.contains("/email"))
{
System.out.println("邮箱="+value);
}
else if(mimetype.contains("/phone"))
{
System.out.println("电话="+value);
}
else if(mimetype.contains("/postal-address_v2"))
{
System.out.println("地址="+value);
}
else if(mimetype.contains("/photo"))
{
System.out.println("照片="+value);
}
else if(mimetype.contains("/group"))
{
System.out.println("组="+value);
}



}
System.out.println("----------------");
contactInfoCursor.close();

}
cursor.close();
}

}

转载于:https://my.oschina.net/xiaofeiandroid/blog/652411

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值