四大天王之内容提供者ContentProvider

来源:互联网 发布:java encodeuri 编码 编辑:程序博客网 时间:2024/04/27 16:09

大家好,给大家带来的是四大组件之一ContentProvider内容提供者,ContentProvide简单的解释是一个平台,用于放数据等一些可传递的东西,然后接受者根据自己的需要去这个平台拿数据,实现了共享数据的作用。我等下把数据库里的数据放在内容提供者这平台,然后去取数据,这样的一个demo.

步骤一:创建bookProvider继承contentProvide类

//定义数据库变量

public static final String TABLE = "t_book";
 public static final String ID = "_id";
 public static final String NAME = "name";
 public static final String PRICE = "price";
 private static final String AUTHORITS = "com.example.demo0819_sqlite.provider.bookprovider";
 private static final int MULTIE = 1;
 private static final int SINGLE = 2;

 public SqliteHelper dbHelper;

 // 配置uri匹配对象
 private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 static {
  // 集合,多行
  // uri1: content:cn.it.sqlite.bookprovider/book
  uriMatcher.addURI(AUTHORITS, "book", MULTIE);
  // 单行
  // uri2: content:cn.it.sqlite.bookprovider/book/6
  uriMatcher.addURI(AUTHORITS, "book/#", SINGLE);

 }

 // 主要是初始化值
 public boolean onCreate() {
  dbHelper = new SqliteHelper(getContext());
  return false;
 }

 // 查询
 public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
  //写入数据库
  SQLiteDatabase db = dbHelper.getWritableDatabase();

  int matchCode = uriMatcher.match(uri);

  // 判断集合或者单行
  switch (matchCode) {
  // uri1: content:cn.it.sqlite.bookprovider/book
  case MULTIE:
   return db.query(TABLE, projection, selection, selectionArgs, null,
     null, sortOrder);
 
  case SINGLE:
   // 获取uri后缀值,这里的后缀值是6
   long parseId = ContentUris.parseId(uri);
      // uri2: content:cn.it.sqlite.bookprovider/book/6
   if (!TextUtils.isEmpty(selection)) {
    selection = selection + " and " + ID + "=" + parseId;
   } else {
    selection = ID + "=" + parseId;

   }
   return db.query(TABLE, projection, selection, selectionArgs, null,
     null, sortOrder);

  default:
   db.close();
   throw new IllegalArgumentException("uri 不合法");

  }

 }

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

 // 添加
 public Uri insert(Uri uri, ContentValues values) {
  SQLiteDatabase db = dbHelper.getWritableDatabase();
  int matchCode = uriMatcher.match(uri);
  // 判断集合
  switch (matchCode) {
  // 判断集合,多行
  case MULTIE:
   long id = db.insert(TABLE, null, values);
   return ContentUris.withAppendedId(uri, id);
        //为什么不用判断当行,因为添加数据id是自动增长的,不用判断也可以
  default:
   db.close();
   throw new IllegalArgumentException("uri 不合法");
  }
 }

 // 删除
 public int delete(Uri uri, String selection, String[] selectionArgs) {
  SQLiteDatabase db = dbHelper.getWritableDatabase();
  int effectNum = 0;// 影响行数

  int matchCode = uriMatcher.match(uri);
  // 判断集合或者单行
  switch (matchCode) {
  case MULTIE:
   // 查询数据 select * from t_book where id=6;
   effectNum = db.delete(TABLE, selection, selectionArgs);
   break;
  case SINGLE:
   // 获取uri后缀值,这里的后缀值是6
   long parseId = ContentUris.parseId(uri);
   if (!TextUtils.isEmpty(selection)) {
    selection = selection + " and " + ID + "=" + parseId;
   } else {
    selection = ID + "=" + parseId;

   }
   effectNum = db.delete(TABLE, selection, selectionArgs);
   break;

  default:
   db.close();
   throw new IllegalArgumentException("uri 不合法");

  }
  return effectNum;
 }

 // 更新
 public int update(Uri uri, ContentValues values, String selection,
   String[] selectionArgs) {
  SQLiteDatabase db = dbHelper.getWritableDatabase();
  int effectNum = 0;// 影响行数

  int matchCode = uriMatcher.match(uri);
  // 判断集合或者单行
  switch (matchCode) {
  case MULTIE:
   effectNum = db.update(TABLE, values, selection, selectionArgs);
   break;
  case SINGLE:
   // 获取uri后缀值,这里的后缀值是6
   long parseId = ContentUris.parseId(uri);
   if (!TextUtils.isEmpty(selection)) {
    selection = selection + " and " + ID + "=" + parseId;
   } else {
    selection = ID + "=" + parseId;

   }
   effectNum = db.update(TABLE, values, selection, selectionArgs);
   break;

  default:
   db.close();
   throw new IllegalArgumentException("uri 不合法");

  }
  return effectNum;
 }
}

步骤三:创建一个测试类TestProvider继承AndroidTestCase

/**
 * 测试内容提供者的测试类

  测试类的使用方法

  run as--->android Junit  test
 */
public class TestProvider extends AndroidTestCase {
 // uri地址 content://标记/数据库名
 public static final String URI_STR = "content://com.example.demo0819_sqlite.provider.bookprovider/book";
 public static final String TABLE = "t_book";
 public static final String ID = "_id";
 public static final String NAME = "name";
 public static final String PRICE = "price";

 // 查询
 public void testQueryProvider() {
  // 访问者,访问内容提供者。得到共享数据的作用
  ContentResolver contentResolver = getContext().getContentResolver();
  // 访问者查询,Uri.parse(URI_STR)解析uri
  Cursor c = contentResolver.query(Uri.parse(URI_STR), null, null, null,
    null);

  // 游标遍历
  while (c.moveToNext()) {
   System.out.println(c.getInt(c.getColumnIndex("_id")));
   System.out.println(c.getString(c.getColumnIndex("name")));
   System.out.println(c.getInt(c.getColumnIndex("price")));

  }
 }

 // 保存
 public void testSaveProvider() {
  ContentValues values = new ContentValues();
  // 访问者
  ContentResolver contentResolver = getContext().getContentResolver();
  values.put("_id", 128);
  values.put("name", "水浒传");
  values.put("price", 70);
  contentResolver.insert(Uri.parse(URI_STR), values);

 }

 // 删除
 public void testDeleteProvider() {
  // 访问者
  ContentResolver contentResolver = getContext().getContentResolver();
  // 访问者删除
  int delete = contentResolver
    .delete(Uri.parse(URI_STR), " _id=75", null);
 }

 // 更新
 public void testUpdateProvider() {
  ContentResolver contentResolver = getContext().getContentResolver();
  ContentValues values = new ContentValues();
  values.put("_id", 126);
  values.put("name", "大话西游3");
  contentResolver.update(Uri.parse(URI_STR), values, " _id=126", null);

 }

 // 电话联系人
 // - Uri:content://call_log/calls :通话记录
 // 字段:_id、number、date、duration
 public void testCall() {
  String uri = "content://call_log/calls";
  ContentResolver contentResolver = getContext().getContentResolver();
  Cursor c = contentResolver
    .query(Uri.parse(uri), null, null, null, null);
  while (c.moveToNext()) {
   System.out.print(c.getString(c.getColumnIndex("number")) + " ");
   System.out.print(c.getString(c.getColumnIndex("date")) + " ");
   System.out.print(c.getString(c.getColumnIndex("duration")) + " ");

  }

 }

}

注意事项:要在androidManifest.xml注册,权限。

//通话记录的权限

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

//测试的注册

<instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.demo0819_sqlite" >
</instrumentation>

//内容提供者的权限。注册标记,android:authorities

<provider
            android:name="com.example.demo0819_sqlite.provider.bookProvider"

            android:authorities="com.example.demo0819_sqlite.provider.bookprovider"
            android:enabled="true" >
</provider>

//测试使用的包

<uses-library android:name="android.test.runner" />


好了,今天就到这了,小编了,要好好休息了,奋斗不止,晚安。




0 0
原创粉丝点击