`
dengbaoleng
  • 浏览: 1162923 次
文章分类
社区版块
存档分类
最新评论

Android 内容提供器Content Providers(二)

 
阅读更多
读取查询所获数据Reading retrieved data

查询返回的游标对象可以用来访问结果记录集。如果你通过指定的一个ID来查询,这个集合将只有一个值。否则,它可以包含多个数值。(如果没有匹配结果,那还可能是空的。)你可以从表格中的特定字段读取数据,但你必须知道这个字段的数据类型,因为这个游标对象对于每种数据类型都有一个单独的读取方法-比如getString(), getInt(), 和getFloat()。(不过,对于大多数类型,如果你调用读取字符串的方法,游标对象将返回给你这个数据的字符串表示。)游标可以让你按列索引请求列名,或者按列名请求列索引。

下面的代码片断演示了如何从前述查询结果中读取名字和电话号码:

java代码:
  1. import android.provider.Contacts.People;

  2. private void getColumnData(Cursor cur){

  3. if (cur.moveToFirst()) {
  4. String name;
  5. String phoneNumber;
  6. int nameColumn = cur.getColumnIndex(People.NAME);
  7. int phoneColumn = cur.getColumnIndex(People.NUMBER);
  8. String imagePath;

  9. do {

  10. // Get the field values
  11. name = cur.getString(nameColumn);
  12. phoneNumber = cur.getString(phoneColumn);
  13. // Do something with the values.
  14. ...

  15. } while (cur.moveToNext());

  16. }
  17. }
复制代码

如果一个查询可能返回二进制数据,比如一个图像或声音,这个数据可能直接被输入到表格或表格条目中也可能是一个content: URI的字符串可用来获取这个数据,一般而言,较小的数据(例如,20到50K或更小)最可能被直接存放到表格中,可以通过调用Cursor.getBlob()来获取。它返回一个字节数组。

如果这个表格条目是一个content: URI,你不该试图直接打开和读取该文件(会因为权限问题而失败)。相反,你应该调用ContentResolver.openInputStream()来得到一个InputStream对象,你可以使用它来读取数据。

修改数据Modifying Data
保存在内容提供器中的数据可以通过下面的方法修改:
增加新的记录
为已有的记录添加新的数据
批量更新已有记录
删除记录
所有的数据修改操作都通过使用ContentResolver方法来完成。一些内容提供器对写数据需要一个比读数据更强的权限约束。如果你没有一个内容提供器的写权限,这个ContentResolver方法会失败。

增加记录Adding records
想要给一个内容提供器增加一个新的记录,第一步是在ContentValues对象里构建一个键-值对映射,这里每个键和内容提供器的一个列名匹配而值是新记录中那个列期望的值。然后调用ContentResolver.insert()并传递给它提供器的URI和这个ContentValues映射图。这个方法返回新记录的URI全名-也就是,内容提供器的URI加上该新记录的扩展ID。你可以使用这个URI来查询并得到这个新记录上的一个游标,然后进一步修改这个记录。下面是一个例子:

java代码:
  1. import android.provider.Contacts.People;
  2. import android.content.ContentResolver;
  3. import android.content.ContentValues;

  4. ContentValues values = new ContentValues();

  5. // Add Abraham Lincoln to contacts and make him a favorite.
  6. values.put(People.NAME, "Abraham Lincoln");

  7. // 1 = the new contact is added to favorites
  8. // 0 = the new contact is not added to favorites
  9. values.put(People.STARRED, 1);

  10. Uri uri = getContentResolver().insert(People.CONTENT_URI, values);
复制代码

增加新值Adding new values
一旦记录已经存在,你就可以添加新的信息或修改已有信息。比如,上例中的下一步就是添加联系人信息-如一个电话号码或一个即时通讯IM或电子邮箱地址-到新的条目中。

在联系人数据库中增加一条记录的最佳途径是在该记录URI后扩展表名,然后使用这个修正的URI来添加新的数据值。为此,每个联系人表暴露一个CONTENT_DIRECTORY常量的表名。下面的代码继续之前的例子,为上面刚刚创建的记录添加一个电话号码和电子邮件地址:

java代码:
  1. Uri phoneUri = null;
  2. Uri emailUri = null;

  3. // Add a phone number for Abraham Lincoln. Begin with the URI for
  4. // the new record just returned by insert(); it ends with the _ID
  5. // of the new record, so we don't have to add the ID ourselves.
  6. // Then append the designation for the phone table to this URI,
  7. // and use the resulting URI to insert the phone number.

  8. phoneUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);
  9. values.clear();
  10. values.put(People.Phones.TYPE, People.Phones.TYPE_MOBILE);
  11. values.put(People.Phones.NUMBER, "1233214567");
  12. getContentResolver().insert(phoneUri, values);

  13. // Now add an email address in the same way.
  14. emailUri = Uri.withAppendedPath(uri, People.ContactMethods.CONTENT_DIRECTORY);
  15. values.clear();

  16. // ContactMethods.KIND is used to distinguish different kinds of
  17. // contact methods, such as email, IM, etc.
  18. values.put(People.ContactMethods.KIND, Contacts.KIND_EMAIL);
  19. values.put(People.ContactMethods.DATA, "test@example.com");
  20. values.put(People.ContactMethods.TYPE, People.ContactMethods.TYPE_HOME);
  21. getContentResolver().insert(emailUri, values);
复制代码

你可以通过调用接收字节流的ContentValues.put()版本来把少量的二进制数据放到一张表格里去。这对于像小图标或短小的音频片断这样的数据是可行的。但是,如果你有大量二进制数据需要添加,比如一张相片或一首完整的歌曲,则需要把该数据的content: URI放到表里然后以该文件的URI调用ContentResolver.openOutputStream() 方法。(这导致内容提供器把数据保存在一个文件里并且记录文件路径在这个记录的一个隐藏字段中。)
分享到:
评论

相关推荐

    android ContentProviders

    Android中的ContentProviders是Android平台用来提供不同类型数据(比如音频、视频、图片、个人联系人等)的一个统一接口。ContentProviders使用URI(统一资源标识符)来识别数据集,并允许一个应用程序存储和检索...

    Content_Providers

    在Android系统中,Content Providers是数据共享的关键机制,它允许应用程序之间进行数据交换,打破了应用间的数据孤岛。本文将深入探讨Content Providers的功能,并通过实例演示如何使用它们。 Content Providers...

    Android的Content ProviderS说明文档

    Content Provider是Android提供的一种机制,使得应用程序能够将自己的数据公开给其他应用访问。通过Content Provider,开发者可以创建一个标准化的数据接口,其他应用可以通过这个接口读取或修改数据,实现了数据的...

    Android应用源码之30.Content_Providers(2).zip

    在Android应用开发中,Content Providers扮演着至关重要的角色。它们是Android系统中数据共享和交换的核心组件,使得不同应用程序之间可以安全地访问和操作数据。本资料主要关注Android应用源码中的Content ...

    Android应用源码之29.Content_Providers(1).zip

    在Android开发中,Content Providers是四大组件之一,它是应用程序间数据共享的重要机制。Content Providers能够让你的应用程序的数据对其他应用程序可见,甚至可以被系统或第三方应用读取和修改。在这个"Android...

    easy-content-providers, 在与定制内容提供商的数据中,轻松集成 Android.zip

    easy-content-providers, 在与定制内容提供商的数据中,轻松集成 Android 内容提供程序轻松集成内置的android和自定义内容提供程序数据。 它甚至还附带了一个示例应用程序和用于调试目的的Stetho扩展。 为什么以及...

    Android学习笔记之——Content Providers

    本博文学习一下Content Providers(内容提供器) 目录 Android运行时 (Android runtime)权限 在程序运行时申请权限 内容提供器简介 访问其他程序中的数据 Android运行时 (Android runtime)权限 Android开发...

    Android应用源码之30.Content_Providers(2)-IT计算机-毕业设计.zip

    Content Providers是Android系统提供的一种机制,用于在应用程序之间共享数据。它们可以处理不同类型的数据,如联系人、日历事件,甚至是存储在SQLite数据库中的自定义数据。通过Content Providers,开发者可以创建...

    Content Providers Demo例子

    Content Providers Demo 下载,对应博文: 【Android 开发】:Content Provider (内容提供者) 详解 :http://blog.csdn.net/ahuier/article/details/11882059 读者可以结合博文阅读,然后下载源代码进行学习。

    Content-Providers(1).rar_android_content provider

    关于Content Providers Content Providers 是所有应用程序之间数据存储和检索的一个桥梁,作用是使得各个应用程序之间实现数据共享。 它是应用程序间共享数据的唯一方法。 在Android中没有一块公共的所有应用程序都...

    Android-实用程序来创建ContentProviders没有样板和沉重的定制选项

    "Android-实用程序来创建ContentProviders没有样板和重型定制选项"项目旨在解决这一问题,提供了一种简化ContentProvider创建的方法。这个项目可能包含一个库或者框架,它通过自动化的代码生成或抽象化处理,减少了...

    应用源码之29.Content_Providers(1).zip

    Content Providers是Android系统中用于存储和检索数据的核心组件,它可以为其他应用程序提供统一的数据接口。通过Content Provider,不同应用间可以安全地共享数据,即使这些数据存储在私有数据库、文件系统或其他...

    Content Providers and SQlite编程

    Content Providers 是所有应用程序之间数据存储和检索的一个桥梁,作用是使得各个应用程序之间实现数据共享。它是应用程序间共享数据的唯一方法。在Android中没有一块公共的所有应用程序都能访问的数据存储地方

    应用源码之30.Content_Providers(2).zip

    在Android开发中,Content Providers是四大组件之一,它是应用程序间数据共享的主要机制。Content Providers能够使得一个应用的数据对其他应用可见,甚至可以被系统服务和外部应用进行读写操作。本压缩包“应用源码...

    29.Content_Providers(1).rar )

    android coolszy 29.Content_Providers(1).rar )29.Content_Providers(1).rar )29.Content_Providers(1).rar )

    Learning Android: Develop Mobile Apps Using Java and Eclipse(第二版)

    Using Content Providers Through Widgets Summary Chapter 15 Networking and Web Overview Quick Example Networking Basics HTTP API Apache HTTP Client HttpUrlConnection Networking in the Background using ...

    Content Provider

    - **Content Resolver**:Content Resolver 是 Android 系统提供的用于与 Content Provider 进行通信的客户端组件。应用程序通过 Content Resolver 对 Content Provider 进行数据操作。 - **Cursor**:在 Android 中...

Global site tag (gtag.js) - Google Analytics