ContentProvider 数据共享

ContentProvider :多个应用之间实现数据共享。

继承contenrProvider的类,在重写提供数据存储和提供数据的方法时,可实现向其他应用程序共享数据。

优点:统一了数据的访问方式。而其他数据存储方式在数据访问时会因为数据的存储方式不同而不同。
 
Android 存储方式有以下几种方式:
(1)SharePreference 轻量级存储
 
存储类型:boolean, Int   ,float,   Long,   String
存储格式:文件.xml
存储形式:键值对
存储位置:data/data/包名/share_prefs/文件名.xml
 
(2) sqlLite数据库
 
轻型数据库,主要用于嵌入式设备,如手机
重要类:
SQLiteOpenHelper  : 在android程序中,需要继承SqliteOpenHelper 来实现打开和关闭数据库
SqLiteDatabase : 对表进行增删改查操作
 
 
public class 类名{
public static final  String DB_NAME="******";//数据库名
public static final String TB_NAME="****";//表名
 
public static final String ID="******"//列名
*********************声明列的属性
 
 public DbAdapter(Context ctx) {
  this.ctx = ctx;
 }
 // 打开数据库的方法
 private DbAdapter open() {
  dbHelper = new DbHelper(ctx);
  db = dbHelper.getWritableDatabase();
  return this;
 }
 // 关闭数据的方法
 private void close() {
  dbHelper.close();
 }
****************下面可以写增删改查方法
private void ***(){ }
private void ***(){ }
.........................
 
 
 
public class 内部类名 extends SQLiteOpenHelper(){
 
         public 内部类名(Context context){
           super(context, 数据库名, null, 1); }//创建库
 
          public void onCreate(){
********************创建表的方法 }
 
            public void onUpgrade(){
*******************更新表销毁表等操作}
 
}}
(3)contentProvider
(4)IO流(即将文件以IO流的方式存储到SD卡)
 
 
 
***************下面写一个关于contentProvider的例子简单的例子*************
 
描述:该内容实现查询手机中通讯录的功能以及增加通讯录内容的功能
 
第一个类:展示页面
 
package com.huyanrui.getphonebook;
/**
 * 获取电话号码
 * */
import android.app.Activity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Contacts.Phones;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
@SuppressWarnings("deprecation")
public class GetPhoneBookActivity extends Activity {
 ListAdapter adapter ;
 /** Called when the activity is first created. */
 private Button btnButton;
 private ListView listView;
 MyContentProvider contentProvider;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  btnButton = (Button)findViewById(R.id.btn);
  listView = (ListView)findViewById(R.id.list);
     contentProvider = new MyContentProvider(GetPhoneBookActivity.this);
  Cursor cursor  = null;
  try {
   cursor = contentProvider.testGetContacts();
  } catch (Throwable e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
   adapter = new SimpleCursorAdapter(this,
    android.R.layout.simple_list_item_2, cursor, new String[] {
      Phones.NAME, Phones.NUMBER}, new int[] {
      android.R.id.text1, android.R.id.text2 });
   listView.setAdapter(adapter);
  
  btnButton.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    insertPhoneNum("张三","12123132");
   }
  });
 }
 private void insertPhoneNum(String name,String phoneNum){
  ContentValues values =  new ContentValues();
  values.put("name", name);
  values.put("number",phoneNum);
  contentProvider.testInsert(values);
 }
}
 
第二个类:工具类,实现查询和加入操作, 备注:注释的部分未作整理
 

package com.huyanrui.getphonebook;

import java.util.ArrayList;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.Contacts.Phones;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts.Data;
import android.provider.ContactsContract.RawContacts;
import android.test.AndroidTestCase;
import android.util.Log;

/**
 *  通讯录操作示例
 *    */
public class MyContentProvider extends AndroidTestCase {
 private static final String TAG = "ContactTest";
 private Context context;
 MyContentProvider (Context context){
  this.context  = context;
 }
 /**
  * 1.获取同通讯录中所有的联系人
  */
// public Cursor testGetContacts() throws Throwable {
//  ContentResolver contentResolver = context.getContentResolver();
//  String uriStr = "content://com.android.contacts/contacts";
//  String uriStr = Phones.CONTENT_URI.toString();
//  Uri uri = Uri.parse(uriStr);
//  Cursor cursor = contentResolver.query(uri, null, null, null, null);
//  Log.d("debug", ""+cursor.getCount());
//  // 遍历联系人
//  while (cursor.moveToNext()) {
//   // 联系人 ID
//   int contactId = cursor.getInt(cursor
//     .getColumnIndex(ContactsContract.Contacts._ID));
//   // 联系人显示名称
//   String name = cursor.getString(cursor
//     .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//
//   // 联系人电话号码需要对另一个 uri
//   // 进行查询:content://com.android.contacts/data/phones
//   Cursor phones = getContext().getContentResolver().query(
//     ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
//     null,
//     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "
//       + contactId, null, null);
//   String phone = "";
//   while (phones.moveToNext()) {
//    phone = phones
//      .getString(phones
//        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));// "data1"
//   }
//
//   // 获取 Email 需要对另一个 uri 进行查询 :
//   // content://com.android.contacts/data/emails
//   Cursor emails = getContext().getContentResolver().query(
//     ContactsContract.CommonDataKinds.Email.CONTENT_URI,
//     null,
//     ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = "
//       + contactId, null, null);
//   while (emails.moveToNext()) {
//    String emailAddress = emails
//      .getString(emails
//        .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));// "data1"
//    Log.d("RongActivity", "emailAddress=" + emailAddress);
//   }
//   emails.close();
//   Log.d(TAG, "Contact [contactId= " + contactId + "name=" + name
//     + ", phone=" + phone + "]");
//  }
//  return cursor;
// }

 /**
  * 2.首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
  * 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见
  */
 public void testInsert(ContentValues valu) {
  ContentValues values = new ContentValues();
  // 首先向RawContacts.CONTENT_URI执行一个空值插入(raw_contacts 表), 为了获取生成的联系人 ID
  Uri rawContactUri = context.getContentResolver()
    .insert(RawContacts.CONTENT_URI, values);
  // 然后获取系统返回的rawContactId , 就是新加入的这个联系人的 ID
  long rawContactId = ContentUris.parseId(rawContactUri);
  // Andorid 中,将联系人的姓名、电话、Email 分别存放在 data 表的同一个字段的三条记录当中 因此要 Insert 三次
  // 往data表入姓名数据
  values.clear();
  // raw_contacts_id 字段,是 raw_contacts表id 的外键,用于说明此记录属于哪一个联系人
  values.put(Data.RAW_CONTACT_ID, rawContactId);
  // mimitype_id 字段,用于描述此数据的类型,电话号码?Email?....
  values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
  values.put(StructuredName.GIVEN_NAME, valu.get("name").toString());
  
  context.getContentResolver()
    .insert(android.provider.ContactsContract.Data.CONTENT_URI,
      values);

  // 往data表入电话数据
  values.clear();
  values.put(Data.RAW_CONTACT_ID, rawContactId);

  values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
  values.put(Phone.NUMBER,valu.get("number").toString());
  values.put(Phone.TYPE, Phone.TYPE_MOBILE);
    context.getContentResolver()
    .insert(android.provider.ContactsContract.Data.CONTENT_URI,
      values);

  // 往data表入Email数据
  values.clear();
  values.put(Data.RAW_CONTACT_ID, rawContactId);
  values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
  values.put(Email.DATA, "[email protected]");
  values.put(Email.TYPE, Email.TYPE_WORK);
context.getContentResolver()
    .insert(android.provider.ContactsContract.Data.CONTENT_URI,
      values);
 }

// /**
//  * 在同一个事务当中保存联系人
//  */
// public void testSave() throws Throwable {
//  // 文档位置:reference\android\provider\ContactsContract.RawContacts.html
//  ArrayList ops = new ArrayList();
//  int rawContactInsertIndex = ops.size();
//  ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
//    .withValue(RawContacts.ACCOUNT_TYPE, null)
//    .withValue(RawContacts.ACCOUNT_NAME, null).build());
//  // 文档位置:reference\android\provider\ContactsContract.Data.html
//  ops.add(ContentProviderOperation
//    .newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
//    .withValueBackReference(Data.RAW_CONTACT_ID,
//      rawContactInsertIndex)
//    .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
//    .withValue(StructuredName.GIVEN_NAME, "赵薇").build());
//  // 更新手机号码:Data.RAW_CONTACT_ID 获取上一条语句插入联系人时产生的 ID
//  ops.add(ContentProviderOperation
//    .newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
//    .withValueBackReference(Data.RAW_CONTACT_ID,
//      rawContactInsertIndex)
//    .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
//    .withValue(Phone.NUMBER, "13671323809")
//    // "data1"
//    .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
//    .withValue(Phone.LABEL, "手机号").build());
//  ops.add(ContentProviderOperation
//    .newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
//    .withValueBackReference(Data.RAW_CONTACT_ID,
//      rawContactInsertIndex)
//    .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
//    .withValue(Email.DATA, "[email protected]")
//    .withValue(Email.TYPE, Email.TYPE_WORK).build());
//
//  // 批量插入 -- 在同一个事务当中
//  ContentProviderResult[] results = context
//    .getContentResolver()
//    .applyBatch(ContactsContract.AUTHORITY, ops);
//  for (ContentProviderResult result : results) {
//   Log.i(TAG, result.uri.toString());
//  }
// }

}
 

第一个类的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <TextView android:layout_width="fill_parent"
  android:layout_height="wrap_content" android:text="name=张三   num= 12345678" />
 <Button android:layout_width="fill_parent"
  android:layout_height="wrap_content" android:text="插入" android:id="@+id/btn" />
 <ListView android:id="@+id/list" android:layout_width="fill_parent"
  android:layout_height="fill_parent" />
</LinearLayout>
 

你可能感兴趣的:(android,数据,ContentProvider,应用程序)