Android四大基本组件之 ContentProvider

Android是如何实现应用程序之间数据共享的?一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的数据是如何存储的,或者是使用数据库还是使用文件,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和这个程序里的数据打交道,例如:添加(insert)、删除(delete)、查询(query)、修改(update),当然需要一定的权限才可以。

如何将应用程序的数据暴露出去? Android提供了ContentProvider,一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限,对于Content Provider,最重要的就是数据模型(data model) 和 URI。

1.数据模型

  Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 "_ID" 数值字段,改字段唯一标识一条数据。

2.URI

  URI,每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的公开URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。所有的Content Provider 的URI 都以"content://" 开头,其中"content:"是用来标识数据是由Content Provider管理的 schema。
      在几乎所有的Content Provider 的操作中都会用到URI,因此一般来讲,如果是自己开发的Content Provider,最好将URI定义为常量,这样在简化开发的同时也提高了代码的可维护性。
      首先来介绍如何访问Content Provider中的数据,访问 Content Provider中的数据主要通过ContentResolver对象,ContentResolver类提供了成员方法可以用来对Content Provider 中的数据进行查询、插入、修改和删除等操作。 以查询为例,查询一个 Content Provider 需要掌握如下的信息。
      唯一标识Content Provider 的URI       需要访问的数据字段名称。       该数据字段的数据类型
  提示: 如果需要访问特定的某条数据记录,只需该记录的ID 即可。
    查询Content Provider的方法有两个:ContentResolver的query() 和 Activity 对象的 managedQuery(),二者接收的参数均相同,返回的都是Cursor 对象,唯一不同的是 使用managedQuery 方法可以让Activity 来管理 Cursor 的生命周期。
    被管理的Cursor 会在 Activity进入暂停状态的时候调用自己的 deactivate 方法自行卸载,而在Activity回到运行状态时会调用自己的requery 方法重新查询生成的Cursor对象。如果一个未被管理的Cursor对象想被Activity管理,可以调用Activity的 startManagingCursor方法来实现。

Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种多应用间数据共享的方式,比如:联系人信息可以被多个应用程序访问。Content Provider是个实现了一组用于提供其他应用程序存取数据的标准方法的类。

应用程序可以在Content Provider中执行如下操作: 查询数据

修改数据

添加数据

删除数据

如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。

当前篇主要说明,如何获取其它应用程序共享的数据,比如获取Android 手机电话薄中的信息。

什么是URI?

在学习如何获取ContentResolver前,有个名词是必须了解的:URI。URI是网络资源的定义,在Android中赋予其更广阔的含义,先看个例子,如下:

content://com.example.project:200/folder/subfolder/etc
\---------/  \---------------------------/ \---/ \--------------------------/
scheme                 host               port        path
                \--------------------------------/
                          authority

将其分为A,B,C,D 4个部分: A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的; B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的   类名。这个标识在<provider> 元素的 authorities属性中说明: <provider name=”.TransportationProvider”  authorities=”com.example.transportationprovider”  . . .  > C:路径,Content Provider使用这些路径来确定当前需要生什么类型的数据,URI中可能不包括路径,也可能包括多个; D:如果URI中包含,表示需要获取的记录的ID;如果没有ID,就表示返回全部; 由于URI通常比较长,而且有时候容易出错,切难以理解。所以,在Android当中定义了一些辅助类,并且定义了一些常量来代替这些长字符串,例如:People.CONTENT_URI

ContentResolver 介绍说明

看完这些介绍,大家一定就明白了,ContentResolver是通过URI来查询ContentProvider中提供的数据。除了URI以外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型。如果你需要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中D部分。

前面也提到了Content providers是以类似数据库中表的方式将数据暴露出去,那么ContentResolver也将采用类似数据库的操作来从Content providers中获取数据。现在简要介绍ContentResolver的主要接口,如下:

返回值 函数声明
final Uri insert (Uri url, ContentValues values)Inserts a row into a table at the given URL.
final int delete (Uri url, String where, String[] selectionArgs)Deletes row(s) specified by a content URI.
final Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Query the given URI, returning a Cursor over the result set.
final int update (Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in a content URI.

下面利用实例做进一步说明:

1:NotePad

Java代码  

  1. package com.yarin.android.Examples_06_07;
  2. import android.net.Uri;
  3. import android.provider.BaseColumns;
  4. public class NotePad
  5. {
  6. //ContentProvider的uri
  7. public static final String  AUTHORITY   = "com.google.provider.NotePad";
  8. private NotePad(){}
  9. // 定义基本字段
  10. public static final class Notes implements BaseColumns
  11. {
  12. private Notes(){}
  13. public static final Uri     CONTENT_URI         = Uri.parse("content://" + AUTHORITY + "/notes");
  14. // 新的MIME类型-多个
  15. public static final String  CONTENT_TYPE        = "vnd.android.cursor.dir/vnd.google.note";
  16. // 新的MIME类型-单个
  17. public static final String  CONTENT_ITEM_TYPE   = "vnd.android.cursor.item/vnd.google.note";
  18. public static final String  DEFAULT_SORT_ORDER  = "modified DESC";
  19. //字段
  20. public static final String  TITLE               = "title";
  21. public static final String  NOTE                = "note";
  22. public static final String  CREATEDDATE     = "created";
  23. public static final String  MODIFIEDDATE        = "modified";
  24. }
  25. }
package com.yarin.android.Examples_06_07;

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

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

	private NotePad(){}

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

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

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

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

		public static final String	DEFAULT_SORT_ORDER	= "modified DESC";

		//字段
		public static final String	TITLE				= "title";
		public static final String	NOTE				= "note";
		public static final String	CREATEDDATE		= "created";
		public static final String	MODIFIEDDATE		= "modified";
	}
}

2:NotePadProvider

Java代码  

  1. package com.yarin.android.Examples_06_07;
  2. import java.util.HashMap;
  3. import android.content.ContentProvider;
  4. import android.content.ContentUris;
  5. import android.content.ContentValues;
  6. import android.content.Context;
  7. import android.content.UriMatcher;
  8. import android.content.res.Resources;
  9. import android.database.Cursor;
  10. import android.database.SQLException;
  11. import android.database.sqlite.SQLiteDatabase;
  12. import android.database.sqlite.SQLiteOpenHelper;
  13. import android.database.sqlite.SQLiteQueryBuilder;
  14. import android.net.Uri;
  15. import android.text.TextUtils;
  16. import com.yarin.android.Examples_06_07.NotePad.Notes;
  17. public class NotePadProvider extends ContentProvider
  18. {
  19. private static final String             TAG                 = "NotePadProvider";
  20. // 数据库名
  21. private static final String             DATABASE_NAME       = "note_pad.db";
  22. private static final int                DATABASE_VERSION    = 2;
  23. // 表名
  24. private static final String             NOTES_TABLE_NAME    = "notes";
  25. private static HashMap<String, String>    sNotesProjectionMap;
  26. private static final int                NOTES               = 1;
  27. private static final int                NOTE_ID             = 2;
  28. private static final UriMatcher         sUriMatcher;
  29. private DatabaseHelper  mOpenHelper;
  30. //创建表SQL语句
  31. private static final String             CREATE_TABLE="CREATE TABLE "
  32. + NOTES_TABLE_NAME
  33. + " (" + Notes._ID
  34. + " INTEGER PRIMARY KEY,"
  35. + Notes.TITLE
  36. + " TEXT,"
  37. + Notes.NOTE
  38. + " TEXT,"
  39. + Notes.CREATEDDATE
  40. + " INTEGER,"
  41. + Notes.MODIFIEDDATE
  42. + " INTEGER" + ");";
  43. static
  44. {
  45. sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  46. sUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES);
  47. sUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);
  48. sNotesProjectionMap = new HashMap<String, String>();
  49. sNotesProjectionMap.put(Notes._ID, Notes._ID);
  50. sNotesProjectionMap.put(Notes.TITLE, Notes.TITLE);
  51. sNotesProjectionMap.put(Notes.NOTE, Notes.NOTE);
  52. sNotesProjectionMap.put(Notes.CREATEDDATE, Notes.CREATEDDATE);
  53. sNotesProjectionMap.put(Notes.MODIFIEDDATE, Notes.MODIFIEDDATE);
  54. }
  55. private static class DatabaseHelper extends SQLiteOpenHelper
  56. {
  57. //构造函数-创建数据库
  58. DatabaseHelper(Context context)
  59. {
  60. super(context, DATABASE_NAME, null, DATABASE_VERSION);
  61. }
  62. //创建表
  63. @Override
  64. public void onCreate(SQLiteDatabase db)
  65. {
  66. db.execSQL(CREATE_TABLE);
  67. }
  68. //更新数据库
  69. @Override
  70. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  71. {
  72. db.execSQL("DROP TABLE IF EXISTS notes");
  73. onCreate(db);
  74. }
  75. }
  76. @Override
  77. public boolean onCreate()
  78. {
  79. mOpenHelper = new DatabaseHelper(getContext());
  80. return true;
  81. }
  82. @Override
  83. //查询操作
  84. public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
  85. {
  86. SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
  87. switch (sUriMatcher.match(uri))
  88. {
  89. case NOTES:
  90. qb.setTables(NOTES_TABLE_NAME);
  91. qb.setProjectionMap(sNotesProjectionMap);
  92. break;
  93. case NOTE_ID:
  94. qb.setTables(NOTES_TABLE_NAME);
  95. qb.setProjectionMap(sNotesProjectionMap);
  96. qb.appendWhere(Notes._ID + "=" + uri.getPathSegments().get(1));
  97. break;
  98. default:
  99. throw new IllegalArgumentException("Unknown URI " + uri);
  100. }
  101. String orderBy;
  102. if (TextUtils.isEmpty(sortOrder))
  103. {
  104. orderBy = NotePad.Notes.DEFAULT_SORT_ORDER;
  105. }
  106. else
  107. {
  108. orderBy = sortOrder;
  109. }
  110. SQLiteDatabase db = mOpenHelper.getReadableDatabase();
  111. Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
  112. c.setNotificationUri(getContext().getContentResolver(), uri);
  113. return c;
  114. }
  115. @Override
  116. // 如果有自定义类型,必须实现该方法
  117. public String getType(Uri uri)
  118. {
  119. switch (sUriMatcher.match(uri))
  120. {
  121. case NOTES:
  122. return Notes.CONTENT_TYPE;
  123. case NOTE_ID:
  124. return Notes.CONTENT_ITEM_TYPE;
  125. default:
  126. throw new IllegalArgumentException("Unknown URI " + uri);
  127. }
  128. }
  129. @Override
  130. //插入数据库
  131. public Uri insert(Uri uri, ContentValues initialValues)
  132. {
  133. if (sUriMatcher.match(uri) != NOTES)
  134. {
  135. throw new IllegalArgumentException("Unknown URI " + uri);
  136. }
  137. ContentValues values;
  138. if (initialValues != null)
  139. {
  140. values = new ContentValues(initialValues);
  141. }
  142. else
  143. {
  144. values = new ContentValues();
  145. }
  146. Long now = Long.valueOf(System.currentTimeMillis());
  147. if (values.containsKey(NotePad.Notes.CREATEDDATE) == false)
  148. {
  149. values.put(NotePad.Notes.CREATEDDATE, now);
  150. }
  151. if (values.containsKey(NotePad.Notes.MODIFIEDDATE) == false)
  152. {
  153. values.put(NotePad.Notes.MODIFIEDDATE, now);
  154. }
  155. if (values.containsKey(NotePad.Notes.TITLE) == false)
  156. {
  157. Resources r = Resources.getSystem();
  158. values.put(NotePad.Notes.TITLE, r.getString(android.R.string.untitled));
  159. }
  160. if (values.containsKey(NotePad.Notes.NOTE) == false)
  161. {
  162. values.put(NotePad.Notes.NOTE, "");
  163. }
  164. SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  165. long rowId = db.insert(NOTES_TABLE_NAME, Notes.NOTE, values);
  166. if (rowId > 0)
  167. {
  168. Uri noteUri = ContentUris.withAppendedId(NotePad.Notes.CONTENT_URI, rowId);
  169. getContext().getContentResolver().notifyChange(noteUri, null);
  170. return noteUri;
  171. }
  172. throw new SQLException("Failed to insert row into " + uri);
  173. }
  174. @Override
  175. //删除数据
  176. public int delete(Uri uri, String where, String[] whereArgs)
  177. {
  178. SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  179. int count;
  180. switch (sUriMatcher.match(uri))
  181. {
  182. case NOTES:
  183. count = db.delete(NOTES_TABLE_NAME, where, whereArgs);
  184. break;
  185. case NOTE_ID:
  186. String noteId = uri.getPathSegments().get(1);
  187. count = db.delete(NOTES_TABLE_NAME, Notes._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ‘)‘ : ""), whereArgs);
  188. break;
  189. default:
  190. throw new IllegalArgumentException("Unknown URI " + uri);
  191. }
  192. getContext().getContentResolver().notifyChange(uri, null);
  193. return count;
  194. }
  195. @Override
  196. //更新数据
  197. public int update(Uri uri, ContentValues values, String where, String[] whereArgs)
  198. {
  199. SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  200. int count;
  201. switch (sUriMatcher.match(uri))
  202. {
  203. case NOTES:
  204. count = db.update(NOTES_TABLE_NAME, values, where, whereArgs);
  205. break;
  206. case NOTE_ID:
  207. String noteId = uri.getPathSegments().get(1);
  208. count = db.update(NOTES_TABLE_NAME, values, Notes._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ‘)‘ : ""), whereArgs);
  209. break;
  210. default:
  211. throw new IllegalArgumentException("Unknown URI " + uri);
  212. }
  213. getContext().getContentResolver().notifyChange(uri, null);
  214. return count;
  215. }
  216. }
package com.yarin.android.Examples_06_07;

import java.util.HashMap;

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

import com.yarin.android.Examples_06_07.NotePad.Notes;

public class NotePadProvider extends ContentProvider
{
	private static final String				TAG					= "NotePadProvider";
	// 数据库名
	private static final String				DATABASE_NAME		= "note_pad.db";
	private static final int				DATABASE_VERSION	= 2;
	// 表名
	private static final String				NOTES_TABLE_NAME	= "notes";
	private static HashMap<String, String>	sNotesProjectionMap;
	private static final int				NOTES				= 1;
	private static final int				NOTE_ID				= 2;
	private static final UriMatcher			sUriMatcher;
	private DatabaseHelper	mOpenHelper;
	//创建表SQL语句
	private static final String				CREATE_TABLE="CREATE TABLE "
														+ NOTES_TABLE_NAME
														+ " (" + Notes._ID
														+ " INTEGER PRIMARY KEY,"
														+ Notes.TITLE
														+ " TEXT,"
														+ Notes.NOTE
														+ " TEXT,"
														+ Notes.CREATEDDATE
														+ " INTEGER,"
														+ Notes.MODIFIEDDATE
														+ " INTEGER" + ");";

	static
	{
		sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		sUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES);
		sUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);

		sNotesProjectionMap = new HashMap<String, String>();
		sNotesProjectionMap.put(Notes._ID, Notes._ID);
		sNotesProjectionMap.put(Notes.TITLE, Notes.TITLE);
		sNotesProjectionMap.put(Notes.NOTE, Notes.NOTE);
		sNotesProjectionMap.put(Notes.CREATEDDATE, Notes.CREATEDDATE);
		sNotesProjectionMap.put(Notes.MODIFIEDDATE, Notes.MODIFIEDDATE);
	}
	private static class DatabaseHelper extends SQLiteOpenHelper
	{
		//构造函数-创建数据库
		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 notes");
			onCreate(db);
		}
	}
	@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 NOTES:
				qb.setTables(NOTES_TABLE_NAME);
				qb.setProjectionMap(sNotesProjectionMap);
				break;

			case NOTE_ID:
				qb.setTables(NOTES_TABLE_NAME);
				qb.setProjectionMap(sNotesProjectionMap);
				qb.appendWhere(Notes._ID + "=" + uri.getPathSegments().get(1));
				break;

			default:
				throw new IllegalArgumentException("Unknown URI " + uri);
		}
		String orderBy;
		if (TextUtils.isEmpty(sortOrder))
		{
			orderBy = NotePad.Notes.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 String getType(Uri uri)
	{
		switch (sUriMatcher.match(uri))
		{
			case NOTES:
				return Notes.CONTENT_TYPE;

			case NOTE_ID:
				return Notes.CONTENT_ITEM_TYPE;

			default:
				throw new IllegalArgumentException("Unknown URI " + uri);
		}
	}
	@Override
	//插入数据库
	public Uri insert(Uri uri, ContentValues initialValues)
	{
		if (sUriMatcher.match(uri) != NOTES)
		{
			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(NotePad.Notes.CREATEDDATE) == false)
		{
			values.put(NotePad.Notes.CREATEDDATE, now);
		}
		if (values.containsKey(NotePad.Notes.MODIFIEDDATE) == false)
		{
			values.put(NotePad.Notes.MODIFIEDDATE, now);
		}
		if (values.containsKey(NotePad.Notes.TITLE) == false)
		{
			Resources r = Resources.getSystem();
			values.put(NotePad.Notes.TITLE, r.getString(android.R.string.untitled));
		}
		if (values.containsKey(NotePad.Notes.NOTE) == false)
		{
			values.put(NotePad.Notes.NOTE, "");
		}
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		long rowId = db.insert(NOTES_TABLE_NAME, Notes.NOTE, values);
		if (rowId > 0)
		{
			Uri noteUri = ContentUris.withAppendedId(NotePad.Notes.CONTENT_URI, rowId);
			getContext().getContentResolver().notifyChange(noteUri, null);
			return noteUri;
		}
		throw new SQLException("Failed to insert row into " + uri);
	}
	@Override
	//删除数据
	public int delete(Uri uri, String where, String[] whereArgs)
	{
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		int count;
		switch (sUriMatcher.match(uri))
		{
			case NOTES:
				count = db.delete(NOTES_TABLE_NAME, where, whereArgs);
				break;

			case NOTE_ID:
				String noteId = uri.getPathSegments().get(1);
				count = db.delete(NOTES_TABLE_NAME, Notes._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 int update(Uri uri, ContentValues values, String where, String[] whereArgs)
	{
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		int count;
		switch (sUriMatcher.match(uri))
		{
			case NOTES:
				count = db.update(NOTES_TABLE_NAME, values, where, whereArgs);
				break;

			case NOTE_ID:
				String noteId = uri.getPathSegments().get(1);
				count = db.update(NOTES_TABLE_NAME, values, Notes._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ‘)‘ : ""), whereArgs);
				break;

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

3:Activity01

Java代码  

  1. package com.yarin.android.Examples_06_07;
  2. import android.app.Activity;
  3. import android.content.ContentValues;
  4. import android.database.Cursor;
  5. import android.net.Uri;
  6. import android.os.Bundle;
  7. import android.view.Gravity;
  8. import android.widget.Toast;
  9. public class Activity01 extends Activity
  10. {
  11. /** Called when the activity is first created. */
  12. @Override
  13. public void onCreate(Bundle savedInstanceState)
  14. {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. /* 插入数据 */
  18. ContentValues values = new ContentValues();
  19. values.put(NotePad.Notes.TITLE, "title1");
  20. values.put(NotePad.Notes.NOTE, "NOTENOTE1");
  21. getContentResolver().insert(NotePad.Notes.CONTENT_URI, values);
  22. values.clear();
  23. values.put(NotePad.Notes.TITLE, "title2");
  24. values.put(NotePad.Notes.NOTE, "NOTENOTE2");
  25. getContentResolver().insert(NotePad.Notes.CONTENT_URI, values);
  26. /* 显示 */
  27. displayNote();
  28. }
  29. private void displayNote()
  30. {
  31. String columns[] = new String[] { NotePad.Notes._ID,
  32. NotePad.Notes.TITLE,
  33. NotePad.Notes.NOTE,
  34. NotePad.Notes.CREATEDDATE,
  35. NotePad.Notes.MODIFIEDDATE };
  36. Uri myUri = NotePad.Notes.CONTENT_URI;
  37. Cursor cur = managedQuery(myUri, columns, null, null, null);
  38. if (cur.moveToFirst())
  39. {
  40. String id = null;
  41. String title = null;
  42. do
  43. {
  44. id = cur.getString(cur.getColumnIndex(NotePad.Notes._ID));
  45. title = cur.getString(cur.getColumnIndex(NotePad.Notes.TITLE));
  46. Toast toast=Toast.makeText(this, "TITLE:"+id + "NOTE:" + title, Toast.LENGTH_LONG);
  47. toast.setGravity(Gravity.TOP|Gravity.CENTER, 0, 40);
  48. toast.show();
  49. }
  50. while (cur.moveToNext());
  51. }
  52. }
  53. }
package com.yarin.android.Examples_06_07;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.Toast;

public class Activity01 extends Activity
{
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		/* 插入数据 */
		ContentValues values = new ContentValues();
        values.put(NotePad.Notes.TITLE, "title1");
        values.put(NotePad.Notes.NOTE, "NOTENOTE1");
		getContentResolver().insert(NotePad.Notes.CONTENT_URI, values);

		values.clear();
        values.put(NotePad.Notes.TITLE, "title2");
        values.put(NotePad.Notes.NOTE, "NOTENOTE2");
		getContentResolver().insert(NotePad.Notes.CONTENT_URI, values);

		/* 显示 */
		displayNote();
	}

	private void displayNote()
	{
		String columns[] = new String[] { NotePad.Notes._ID,
										  NotePad.Notes.TITLE,
										  NotePad.Notes.NOTE,
										  NotePad.Notes.CREATEDDATE,
										  NotePad.Notes.MODIFIEDDATE };
		Uri myUri = NotePad.Notes.CONTENT_URI;
		Cursor cur = managedQuery(myUri, columns, null, null, null);
		if (cur.moveToFirst())
		{
			String id = null;
			String title = null;
			do
			{
				id = cur.getString(cur.getColumnIndex(NotePad.Notes._ID));
				title = cur.getString(cur.getColumnIndex(NotePad.Notes.TITLE));
				Toast toast=Toast.makeText(this, "TITLE:"+id + "NOTE:" + title, Toast.LENGTH_LONG);
				toast.setGravity(Gravity.TOP|Gravity.CENTER, 0, 40);
				toast.show();
			}
			while (cur.moveToNext());
		}
	}

}

4:AndroidManifest.xml

Xml代码  

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yarin.android.Examples_06_07" android:versionCode="1" android:versionName="1.0">
  3. <application android:icon="@drawable/icon" android:label="@string/app_name">
  4. <provider android:name="NotePadProvider" android:authorities="com.google.provider.NotePad"/>
  5. <activity android:name=".Activity01" android:label="@string/app_name">
  6. <intent-filter>
  7. <action android:name="android.intent.action.MAIN"/>
  8. <category android:name="android.intent.category.LAUNCHER"/>
  9. </intent-filter>
  10. <intent-filter>
  11. <data android:mimeType="vnd.android.cursor.dir/vnd.google.note"/>
  12. </intent-filter>
  13. <intent-filter>
  14. <data android:mimeType="vnd.android.cursor.item/vnd.google.note"/>
  15. </intent-filter>
  16. </activity>
  17. </application>
  18. <uses-sdk android:minSdkVersion="5"/>
  19. </manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yarin.android.Examples_06_07" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<provider android:name="NotePadProvider" android:authorities="com.google.provider.NotePad"/>
<activity android:name=".Activity01" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note"/>
</intent-filter>
<intent-filter>
<data android:mimeType="vnd.android.cursor.item/vnd.google.note"/>
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="5"/>
</manifest>

摘自于http://lpqsun-126-com.iteye.com/blog/1257643

时间: 2024-08-01 20:49:56

Android四大基本组件之 ContentProvider的相关文章

Android四大基本组件介绍与生命周期介绍。

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据. 典型的动作类型有:M AIN(activity的门户).V

关于Android四大基本组件介绍与生命周期(转)

Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据. 典型的动作类型有

Android四大基本组件(1)之Activity与BroadcastReceive广播接收器

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一.Activity (1)应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. (2)Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据. (3)典型的动作类型有:M AIN(activity的门户).VIE

Android四大基本组件介绍与生命周期

主要参考: 1.http://blog.csdn.net/android_tutor/article/details/5772285 2.http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html Android四大基本组件介绍与生命周期,布布扣,bubuko.com

android四大基础组件--Service生命周期详解

android四大基础组件--ServiceService 生命周期详解 1.Service的生命周期: I> 在非绑定Service情况下,只有oncreate(),onStartCommand(),onDestory()方法情况下:  操作方法对应生命周期一: a.[执行startService(Intent)] 执行生命周期方法:oncreate()--->onStartCommand(): b.[执行stopService(Intent)] 执行生命周期方法:onDestory();

Android四大基本组件(3)之四大组件总结

关于四大基本组件的一个总结: 1> 4大组件的注册 4大基本组件都需要注册才能使用,每个Activity.service.Content Provider内容提供者都需要在AndroidManifest文件中进行配置AndroidManifest文件中未进行声明的activity.服务以及内容提供者将不为系统所见,从而也就不可用,而BroadcastReceive广播接收者的注册分静态注册(在AndroidManifest文件中进行配置)和通过代码动态创建并以调用Context.register

Android四大基本组件之 BroadcastReceiver介绍

本文主要介绍BroadcastReceiver的概念.使用.生命周期.安全性.分类.特殊的BroadcastReceiver(本地.粘性.有序.粘性有序广播). 示例代码见BroadcastReceiverDemo,示例APK见:TrineaAndroidDemo.apk. 1.概念介绍及两种注册方式的区别 BroadcastReceiver作为Android四大组件之一,不像Activity,没有可显示的界面.BroadcastReceiver包括两个概念,广播发送者和广播接收者(Receiv

Android四大基本组件之 Service

一.Service的简介 1.Service介绍和作用 Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序.比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了. 2.Service生命周期 Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,

Android四大基本组件(2)之Service 服务与Content Provider内容提供者

一.Service 服务: 一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序. 比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器.在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲.然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的.在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从