Android -----数据共享ContentProvider

本文介绍了在Android应用中使用ContentProvider实现不同程序间数据共享的方法,包括继承ContentProvider,实现其方法,以及使用ContentUris进行数据操作。

AAndroid中内置了SQLite,但是对于数据库操作这块,非常的麻烦.其实可以试用第3方的数据库持久化框架对之进行结构上调整, 摆脱了访问数据库操作的细节,不用再去写复杂的SQL语句.虽然这样会在数据库操作上损失一点性能,但基于xxxx对数据库操作不频繁性能要求不高可以使用,所带来的好处即使有一个良好的统一的数据库操作以及降低代码维护成本.然而,SQLite的数据库只能有本程序访问数据。但为了不同的程序间可以共享数据,Android 有给我们提供了ContentProvider,只需要声明权限,是不同程序间的数据共享提供了可能。

 

对于使用ContentProvider的第一步我们需要继承ContentProvider,实现并重写ContentProvider搜提供的方法。ContentProvider 所提供的发法有:用于外部删除数据 int delete(Uri uri, String selection, String[] selectionArgs), Uri insert(Uri uri, ContentValues values), 用于外部查询Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder),用于外部更新数据int update(Uri uri, ContentValues values, String selection,
   String[] selectionArgs),boolean onCreate()方法ContentProvider在其它程序第一次访问时创建 ,返回当前Uri所代表的类型String getType(Uri uri)此函数,如果ContentProvider是自己定义的必须实现。

 

在第二不是会用到Android提供的另一个辅助类ContentUris,在下述的代码中使用ContentUris工具类构造添加数据后这条记录的Uri,ContentUris类用于获取Uri路径后面的ID部分。它有两个有用的方法。

(1)withAppendedID(uri,id),用于为路径加上ID部分。

(2)parseId(id)方法用于从路径中获取ID部分。

主要代码演示:

package com.itcast.utils;

import android.net.Uri;
import android.provider.BaseColumns;

public class Person
{

  //ContentProvider的uri
    public static final String    AUTHORITY    = "com.google.provider.person";

    private Person(){}

    // 定义基本字段
    public static final class Informations implements BaseColumns
    {
        private Informations(){}

        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/persons");

 

 

package com.itcast.database;

import com.itcast.utils.Person.Informations;

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

public class DatabaseHelper extends SQLiteOpenHelper
{
  // 数据库名
    private static final String DATABASE_NAME = "person.db";
    private static final int   DATABASE_VERSION    = 1;
    // 表名
    public static final String TABLE_NAME = "persons";
    //创建表SQL语句
    private static final String CREATE_TABLE="CREATE TABLE "
                                                        + TABLE_NAME
                                                        + " (" + Informations._ID
                                                        + " INTEGER PRIMARY KEY,"
                                                        + Informations.NAME
                                                        + " varcahr(10),"
                                                        + Informations.SEX
                                                        + " varchar(2),"
                                                        + Informations.CREATEDDATE
                                                        + " INTEGER,"
                                                        + Informations.MODIFIEDDATE
                                                        + " INTEGER" + ");";


  //构造函数-创建数据库
    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_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 IF EXISTS persons");
        onCreate(db);
    }
}

 

        // 新的MIME类型-多个
        public static final String CONTENT_TYPE  = "vnd.android.cursor.dir/vnd.google.person";

        // 新的MIME类型-单个
        public static final String CONTENT_ITEM_TYPE  = "vnd.android.cursor.item/vnd.google.person";

        public static final String  DEFAULT_SORT_ORDER    = "modified DESC";

        //字段
        public static final String    NAME  = "name";
        public static final String    SEX  = "sex";
      
        public static final String    CREATEDDATE  = "created";
        public static final String    MODIFIEDDATE  = "modified";
    }

}

 

package com.itcast.database;

import java.util.HashMap;

import com.itcast.utils.Person;
import com.itcast.utils.Person.Informations;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;

public class PersonContentProvider extends ContentProvider
{

 private static HashMap<String, String> sPersonProjectionMap;
 private static final int PERSON = 1;
 private static final int PERSON_ID = 2;
 private static final UriMatcher sUriMatcher ;
 private DatabaseHelper mOpenHelper;

 static
 {
  sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  sUriMatcher.addURI(Person.AUTHORITY, "persons", PERSON);
  sUriMatcher.addURI(Person.AUTHORITY, "persons/#", PERSON_ID);

  sPersonProjectionMap = new HashMap<String, String>();
  sPersonProjectionMap.put(Informations._ID, Informations._ID);
  sPersonProjectionMap.put(Informations.NAME, Informations.NAME);
  sPersonProjectionMap.put(Informations.SEX, Informations.SEX);
  sPersonProjectionMap.put(Informations.CREATEDDATE,
    Informations.CREATEDDATE);
  sPersonProjectionMap.put(Informations.MODIFIEDDATE, Informations.MODIFIEDDATE);
 }

 @Override
 public int delete(Uri uri, String where, String[] whereArgs)
 {
   SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         int count;
         switch (sUriMatcher.match(uri))
         {
             case PERSON:
                 count = db.delete(mOpenHelper.TABLE_NAME, where, whereArgs);
                 break;

             case PERSON_ID:
                 String noteId = uri.getPathSegments().get(1);
                 count = db.delete(mOpenHelper.TABLE_NAME, Informations._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
                 break;

             default:
                 throw new IllegalArgumentException("Unknown URI " + uri);
         }
         getContext().getContentResolver().notifyChange(uri, null);
         return count;
 }

  // 如果有自定义类型,必须实现该方法
 @Override
 public String getType(Uri uri)
 {

  switch (sUriMatcher.match(uri))
        {
            case PERSON:
                return Informations.CONTENT_TYPE;

            case PERSON_ID:
                return Informations.CONTENT_ITEM_TYPE;

            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }

 }
    //插入数据库

 @Override
 public Uri insert(Uri uri, ContentValues initialValues)
 {

   if (sUriMatcher.match(uri) != PERSON)
         {
             throw new IllegalArgumentException("Unknown URI " + uri);
         }
         ContentValues values;
         if (initialValues != null)
         {
             values = new ContentValues(initialValues);
         }
         else
         {
             values = new ContentValues();
         }
         Long now = Long.valueOf(System.currentTimeMillis());

         if (values.containsKey(Informations.CREATEDDATE) == false)
         {
             values.put(Informations.CREATEDDATE, now);
         }
         if (values.containsKey(Informations.MODIFIEDDATE) == false)
         {
             values.put(Informations.MODIFIEDDATE, now);
         }
//         if (values.containsKey(Informations.NAME) == false)
//         {
//             Resources r = Resources.getSystem();
//             values.put(Informations.NAME, r.getString(android.R.string.untitled));
//         }
         if (values.containsKey(Informations.SEX) == false)
         {
             values.put(Informations.SEX, "");
         }
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         long rowId = db.insert(mOpenHelper.TABLE_NAME, Informations.NAME, values);
         if (rowId > 0)
         {
             Uri noteUri = ContentUris.withAppendedId(Informations.CONTENT_URI, rowId);
             getContext().getContentResolver().notifyChange(noteUri, null);
             return noteUri;
         }
         throw new SQLException("Failed to insert row into " + uri);

 }

 @Override
 public boolean onCreate()
 {

  mOpenHelper = new DatabaseHelper(getContext());
  return true;
 }

 @Override
 public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder)
 {
   SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
  
   switch (sUriMatcher.match(uri))
  {
  case PERSON:
   qb.setTables(mOpenHelper.TABLE_NAME);
    qb.setProjectionMap(sPersonProjectionMap);
   break;

  case PERSON_ID:
   qb.setTables(mOpenHelper.TABLE_NAME);
    qb.setProjectionMap(sPersonProjectionMap);
    qb.appendWhere(PERSON_ID+ "=" + uri.getPathSegments().get(1));
   break;
   default:
             throw new IllegalArgumentException("Unknown URI " + uri);
  }
   String orderBy;
         if (TextUtils.isEmpty(sortOrder))
         {
             orderBy = Person.Informations.DEFAULT_SORT_ORDER;
         }
         else
         {
             orderBy = sortOrder;
         }
         SQLiteDatabase db = mOpenHelper.getReadableDatabase();
         Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
         c.setNotificationUri(getContext().getContentResolver(), uri);
         return c;

 }

 @Override
 public int update(Uri uri, ContentValues values, String where, String[] whereArgs)
 {
     SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         int count;
         switch (sUriMatcher.match(uri))
         {
             case PERSON:
                 count = db.update(mOpenHelper.TABLE_NAME, values, where, whereArgs);
                 break;

             case PERSON_ID:
                 String noteId = uri.getPathSegments().get(1);
                 count = db.update(mOpenHelper.TABLE_NAME, values, Person.Informations._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
                 break;

             default:
                 throw new IllegalArgumentException("Unknown URI " + uri);
         }
         getContext().getContentResolver().notifyChange(uri, null);
         return count;

 }

}

 

这里是ContentProvider的主要代码,剩下的就是自己写要调用的部分。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值