Content Resolver简介

每个应用程序都有一个ContentResolver实例,通过getContentResolver()方法可以获取:

ContentResolver cr = getContentResolver();

与Content Provider对应,Content Resolver用于使用Content Provider发布的数据。使用ContentResolver查询ConentProvider提供的数据:

// Get the Content Resolver.
ContentResolver cr = getContentResolver();
// Specify the result column projection. Return the minimum set of columns required to satisfy your requirements.
String[] result_columns = new String[] {
  MyHoardContentProvider.KEY_ID,
  MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN,
  MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN };
// Specify the where clause that will limit your results.
String where = MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN + “=” + 1;
// Replace these with valid SQL statements as necessary.
String whereArgs[] = null;
String order = null;
// Return the specified rows.
Cursor resultCursor = cr.query(MyHoardContentProvider.CONTENT_URI, result_columns, where, whereArgs, order);

从Cursor中解析数据的方法和上一篇博文中介绍的一样,首先要移动到指定行,然后从指定列中获取对应类型的数据:

float largestHoard = 0f;
String hoardName = “No Hoards”;
// Find the index to the column(s) being used.
int GOLD_HOARDED_COLUMN_INDEX = resultCursor.getColumnIndexOrThrow(
MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN);
int HOARD_NAME_COLUMN_INDEX = resultCursor.getColumnIndexOrThrow(
MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN);
// Iterate over the cursors rows.
// The Cursor is initialized at before first, so we can
// check only if there is a “next” row available. If the
// result Cursor is empty, this will return false.
while (resultCursor.moveToNext()) {
float hoard = resultCursor.getFloat(GOLD_HOARDED_COLUMN_INDEX);
if (hoard > largestHoard) {
largestHoard = hoard;
hoardName = resultCursor.getString(HOARD_NAME_COLUMN_INDEX);
}
}
// Close the Cursor when you’ve finished with it.
resultCursor.close();

使用Cursor Loader进行异步查询

Cursor Loader存在于在每个Activity和Fragment中,可以实现异步查询和监听底层数据的变化。例如管理Cursor的生命周期,确保在Activity退出之前Cursor被关闭。

实现LoaderCallbacks接口

若要使用Cursor Loader,首先要实现LoaderManager.LoaderCallbacks接口:

LoaderManager.LoaderCallbacks<Cursor> loaderCallback = new LoaderManager.LoaderCallbacks<Cursor>()

LoaderCallback主要有这几个回调方法:

  • onCreateLoader
  • onLoadFinished
  • onLoaderReset
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
  // Construct the new query in the form of a Cursor Loader. Use the id
  // parameter to construct and return different loaders.
  String[] projection = null;
  String where = null;
  String[] whereArgs = null;
  String sortOrder = null;
  // Query URI
  Uri queryUri = MyContentProvider.CONTENT_URI;
  // Create the new Cursor loader.
  return new CursorLoader(DatabaseSkeletonActivity.this, queryUri,projection, where, whereArgs, sortOrder);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
  // Replace the result Cursor displayed by the Cursor Adapter with the new result set.
  adapter.swapCursor(cursor);
  // This handler is not synchronized with the UI thread, so you will need to synchronize it before modifying any UI elements directly.
}
public void onLoaderReset(Loader<Cursor> loader) {
  // Remove the existing result Cursor from the List Adapter.
  adapter.swapCursor(null);
  // This handler is not synchronized with the UI thread, so you
  // will need to synchronize it before modifying any UI elements directly.
}

初始化和重启Cursor Loader

在Activity和Fragment中,可以调用getLoaderManager获得Cursor Loader

LoaderManager loaderManager = getLoaderManager();

获取Cursor Loader:

Bundle args = null;
loaderManager.initLoader(LOADER_ID, args, myLoaderCallbacks);

LOADER_ID用于标识获得的loader,args是可选参数,myLoaderCallbacks则是前面LoaderManager.LoaderCallbacks接口的实现。如果对应LOADER_ID的Cursor Loader不存在,那么系统会调用onCreateLoader方法来创建一个Loader。

使用Content Resolver增、改、删

插入数据:

// Create a new row of values to insert.
ContentValues newValues = new ContentValues();
// Assign values for each row.
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN, hoardName);
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, hoardValue);
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, hoardAccessible);
// [ ... Repeat for each column / value pair ... ]
// Get the Content Resolver
ContentResolver cr = getContentResolver();
// Insert the row into your table
Uri myRowUri = cr.insert(MyHoardContentProvider.CONTENT_URI, newValues);

删除数据:

// Specify a where clause that determines which row(s) to delete.
// Specify where arguments as necessary.
String where = MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN + “=” + 0;
String whereArgs[] = null;
// Get the Content Resolver.
ContentResolver cr = getContentResolver();
// Delete the matching rows
int deletedRowCount = cr.delete(MyHoardContentProvider.CONTENT_URI, where, whereArgs);

修改数据:

// Create the updated row content, assigning values for each row.
ContentValues updatedValues = new ContentValues();
updatedValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, newHoardValue);
// [ ... Repeat for each column to update ... ]
// Create a URI addressing a specific row.
Uri rowURI = ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI, hoardId);
// Specify a specific row so no selection clause is required.
String where = null;
String whereArgs[] = null;
// Get the Content Resolver.
ContentResolver cr = getContentResolver();
// Update the specified row.
int updatedRowCount = cr.update(rowURI, updatedValues, where, whereArgs);

使用Content Resolver读写Content Provider中的数据

public void addNewHoardWithImage(String hoardName, float hoardValue, boolean hoardAccessible, Bitmap bitmap) {
  // Create a new row of values to insert.
  ContentValues newValues = new ContentValues();
  // Assign values for each row.
  newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN, hoardName);
  newValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, hoardValue);
  newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, hoardAccessible);
  // Get the Content Resolver
  ContentResolver cr = getContentResolver();
  // Insert the row into your table
  Uri myRowUri = cr.insert(MyHoardContentProvider.CONTENT_URI, newValues);
  try {
    // Open an output stream using the new row’s URI.
    OutputStream outStream = cr.openOutputStream(myRowUri);
    // Compress your bitmap and save it into your provider.
    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outStream);
  }catch (FileNotFoundException e) {
    Log.d(TAG, “No file found for this record.”);
  }
}
public Bitmap getHoardImage(long rowId) {
  Uri myRowUri = ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI, rowId);
  try {
    // Open an input stream using the new row’s URI.
    InputStream inStream = getContentResolver().openInputStream(myRowUri);
    // Make a copy of the Bitmap.
    Bitmap bitmap = BitmapFactory.decodeStream(inStream);
    return bitmap;
  }catch (FileNotFoundException e) {
    Log.d(TAG, “No file found for this record.”);
  }
  return null;
}

Android 4 学习(17):使用Content Resolver的更多相关文章

  1. Android开发学习之路--Content Provider之初体验

    天气说变就变,马上又变冷了,还好空气不错,阳光也不错,早起上班的车上的人也不多,公司来的同事和昨天一样一样的,可能明天会多一些吧,那就再来学习android吧.学了两个android的组件,这里学习下 ...

  2. 我的Android 4 学习系列之数据库和Content Provider

    目录 创建数据库和使用SQLite 使用Content Provider.Cusor和Content Value来存储.共享和使用应用程序数据 使用Cursor Loader异步查询Content P ...

  3. Android 4 学习(16):Database and Content Providers

    参考<Professional Android 4 Development> Database and Content Providers Android Database简介 Andro ...

  4. Android Animation学习(二) ApiDemos解析:基本Animatiors使用

    Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.ObjectAnimator.AnimatorSet ApiDemos中Animation部分是单独 ...

  5. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)——探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

  6. android 开发学习笔记 (一)

    每个app 都有一个自己的 linux 进程: 每个进程都在自己的虚拟机里执行 两个app 可以跑在一个进程,一个vm里 android app 四大组件:activity,content provi ...

  7. Android Animation学习(二) ApiDemos解析:基本Animators使用

    Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...

  8. Android Testing学习01 介绍 测试测什么 测试的类型

    Android Testing学习01 介绍 测试测什么 测试的类型 Android 测试 测什么 1.Activity的生命周期事件 应该测试Activity的生命周期事件处理. 如果你的Activ ...

  9. Android开发学习之LauncherActivity开发启动的列表

    Android开发学习之LauncherActivity开发启动的列表 创建项目:OtherActivity 项目运行结果:   建立主Activity:OtherActivity.java [jav ...

随机推荐

  1. Android 4.0 Camera架构分析之Camera初始化

    Android Camera 采用C/S架构,client 与server两个独立的线程之间使用Binder通信,这已经是众所周知的了.这里将介绍Camera从设备开机,到进入相机应用是如何完成初始化 ...

  2. U盘传送容量与格式问题

    问题 今天想将7.6G的文件拷到U盘里,提示u盘内存不足,其实内存为14+G. 解答 U盘格式对于U盘的传送大小有限制 下面为U盘三种不同格式的应用及优缺点 FAT32格式:为系统默认格式,具有极佳的 ...

  3. (转)3D LUT

    这是 @Air君·Saunato·LoFoTo 大神运用3DLUT的作品 这是借用昔年大神 @昔年Olivia 用3DLUT的片片 http://paopaopaojiao.lofter.com/po ...

  4. scrapy模拟浏览器爬取验证码页面

    使用selenium模块爬取验证码页面,selenium模块需要另外安装这里不讲环境的配置,我有一篇博客有专门讲ubuntn下安装和配置模拟浏览器的开发 spider的代码 # -*- coding: ...

  5. Ubuntu搭建 Apache、MySQL、PHP环境

    以Ubuntu 16.04为例: 1.安装MysSQL 打开命令行输入 :sudo apt-get install mysql-server 输入管理员密码 选择Y 在安装的中间会出现输入Mysql的 ...

  6. css 常用类名

    1.页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sidebar 栏目:column  ...

  7. c/c++指针详解(二)

    指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占 ...

  8. torcs代码

    /** Info returned by driver during the race */ typedef struct { tdble steer; /**< Steer command [ ...

  9. HDFS(一)

    HDFS的概念 HDFS首先是文件系统(FileSystem,FS),尽管这个FS是基于OS原生的文件系统之上:而且这个文件系统是一个抽象概念,HDFS作为一个整体出现,对外(client)隐藏了其内 ...

  10. linux下使用tar命令详解

    解压语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用. 主选项: c 创建新的档案文件.如果用户想备份一个目录或 ...