Content Provider

创建Content Provider分三个步骤:

1. 建立一个存储数据的系统,android中的大多数都是使用SQLite数据库(本文不涉及其它方式)

2. 扩展 ContentProvider 类访问数据

3. 在程序的AndroidManifest.xml文件中声明。

继承ContentProvider需要实现这六个方法:

query()
insert()
update()
delete()
getType()
onCreate()

注意:因为ContentProvider可能被不同的进程和线程调用,所以这些方法必须是线程安全的。

  1. package com.example.android.notepad;
  2. import android.net.Uri;
  3. import android.provider.BaseColumns;
  4. /**
  5.  * Convenience definitions for NotePadProvider
  6.  * Content Provider的基础类,该类定义了每一列的名字,内容Uri,默认排序方式等常量
  7.  */
  8. public final class NotePad {
  9.     public static final String AUTHORITY = “com.google.provider.NotePad”;
  10.     // This class cannot be instantiated
  11.     private NotePad() {}
  12.     /**
  13.      * Notes table
  14.      * BaseColumns定义了两个基本字段_ID(每一行的ID)和_COUNT(每个目录下的行数)
  15.      */
  16.     public static final class Notes implements BaseColumns {
  17.         // This class cannot be instantiated
  18.         private Notes() {}
  19.         /**
  20.          * The content:// style URL for this table
  21.          */
  22.         public static final Uri CONTENT_URI = Uri.parse(“content://” + AUTHORITY + “/notes”);
  23.         /**
  24.          * The MIME type of {@link #CONTENT_URI} providing a directory of notes.
  25.          * 定义新的MIME类型对应notes的目录
  26.          */
  27.         public static final String CONTENT_TYPE = “vnd.android.cursor.dir/vnd.google.note”;
  28.         /**
  29.          * The MIME type of a {@link #CONTENT_URI} sub-directory of a single note.
  30.          * 定义新的MIME类型对应一个note
  31.          */
  32.         public static final String CONTENT_ITEM_TYPE = “vnd.android.cursor.item/vnd.google.note”;
  33.         /**
  34.          * The default sort order for this table
  35.          */
  36.         public static final String DEFAULT_SORT_ORDER = “modified DESC”;
  37.         /**
  38.          * The title of the note
  39.          * <P>Type: TEXT</P>
  40.          */
  41.         public static final String TITLE = “title”;
  42.         /**
  43.          * The note itself
  44.          * <P>Type: TEXT</P>
  45.          */
  46.         public static final String NOTE = “note”;
  47.         /**
  48.          * The timestamp for when the note was created
  49.          * <P>Type: INTEGER (long from System.curentTimeMillis())</P>
  50.          */
  51.         public static final String CREATED_DATE = “created”;
  52.         /**
  53.          * The timestamp for when the note was last modified
  54.          * <P>Type: INTEGER (long from System.curentTimeMillis())</P>
  55.          */
  56.         public static final String MODIFIED_DATE = “modified”;
  57.     }
  58. }
  1. package com.example.android.notepad;
  2. import com.example.android.notepad.NotePad.Notes;
  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 android.util.Log;
  17. import java.util.HashMap;
  18. /**
  19.  * Provides access to a database of notes. Each note has a title, the note
  20.  * itself, a creation date and a modified data.
  21.  */
  22. public class NotePadProvider extends ContentProvider {
  23.     private static final String TAG = “NotePadProvider”;
  24.         //数据库名
  25.     private static final String DATABASE_NAME = “note_pad.db”;
  26.     private static final int DATABASE_VERSION = 2;
  27.     //表名
  28.     private static final String NOTES_TABLE_NAME = “notes”;
  29.     private static HashMap<String, String> sNotesProjectionMap;
  30.     private static final int NOTES = 1;
  31.     private static final int NOTE_ID = 2;
  32.     private static final UriMatcher sUriMatcher;
  33.     /**
  34.      * This class helps open, create, and upgrade the database file.
  35.      */
  36.     private static class DatabaseHelper extends SQLiteOpenHelper {
  37.         DatabaseHelper(Context context) {
  38.             super(context, DATABASE_NAME, null, DATABASE_VERSION);
  39.         }
  40.         @Override
  41.         public void onCreate(SQLiteDatabase db) {
  42.             db.execSQL(“CREATE TABLE ” + NOTES_TABLE_NAME + ” (“
  43.                     + Notes._ID + ” INTEGER PRIMARY KEY,”
  44.                     + Notes.TITLE + ” TEXT,”
  45.                     + Notes.NOTE + ” TEXT,”
  46.                     + Notes.CREATED_DATE + ” INTEGER,”
  47.                     + Notes.MODIFIED_DATE + ” INTEGER”
  48.                     + “);”);
  49.         }
  50.         @Override
  51.         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  52.             Log.w(TAG, “Upgrading database from version ” + oldVersion + ” to “
  53.                     + newVersion + “, which will destroy all old data”);
  54.             db.execSQL(“DROP TABLE IF EXISTS notes”);
  55.             onCreate(db);
  56.         }
  57.     }
  58.     private DatabaseHelper mOpenHelper;
  59.     @Override
  60.     public boolean onCreate() {
  61.         mOpenHelper = new DatabaseHelper(getContext());
  62.         return true;
  63.     }
  64.     @Override
  65.     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
  66.             String sortOrder) {
  67.         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
  68.         switch (sUriMatcher.match(uri)) {
  69.         case NOTES:
  70.             qb.setTables(NOTES_TABLE_NAME);
  71.             qb.setProjectionMap(sNotesProjectionMap);
  72.             break;
  73.         case NOTE_ID:
  74.             qb.setTables(NOTES_TABLE_NAME);
  75.             qb.setProjectionMap(sNotesProjectionMap);
  76.             qb.appendWhere(Notes._ID + “=” + uri.getPathSegments().get(1));
  77.             break;
  78.         default:
  79.             throw new IllegalArgumentException(“Unknown URI ” + uri);
  80.         }
  81.         // If no sort order is specified use the default
  82.         String orderBy;
  83.         if (TextUtils.isEmpty(sortOrder)) {
  84.             orderBy = NotePad.Notes.DEFAULT_SORT_ORDER;
  85.         } else {
  86.             orderBy = sortOrder;
  87.         }
  88.         // Get the database and run the query
  89.         SQLiteDatabase db = mOpenHelper.getReadableDatabase();
  90.         Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
  91.         // Tell the cursor what uri to watch, so it knows when its source data changes
  92.         c.setNotificationUri(getContext().getContentResolver(), uri);
  93.         return c;
  94.     }
  95.     @Override
  96.     //如果有自定义类型,必须实现该方法
  97.     public String getType(Uri uri) {
  98.         switch (sUriMatcher.match(uri)) {
  99.         case NOTES:
  100.             return Notes.CONTENT_TYPE;
  101.         case NOTE_ID:
  102.             return Notes.CONTENT_ITEM_TYPE;
  103.         default:
  104.             throw new IllegalArgumentException(“Unknown URI ” + uri);
  105.         }
  106.     }
  107.     @Override
  108.     public Uri insert(Uri uri, ContentValues initialValues) {
  109.         // Validate the requested uri
  110.         if (sUriMatcher.match(uri) != NOTES) {
  111.             throw new IllegalArgumentException(“Unknown URI ” + uri);
  112.         }
  113.         ContentValues values;
  114.         if (initialValues != null) {
  115.             values = new ContentValues(initialValues);
  116.         } else {
  117.             values = new ContentValues();
  118.         }
  119.         Long now = Long.valueOf(System.currentTimeMillis());
  120.         // Make sure that the fields are all set
  121.         if (values.containsKey(NotePad.Notes.CREATED_DATE) == false) {
  122.             values.put(NotePad.Notes.CREATED_DATE, now);
  123.         }
  124.         if (values.containsKey(NotePad.Notes.MODIFIED_DATE) == false) {
  125.             values.put(NotePad.Notes.MODIFIED_DATE, now);
  126.         }
  127.         if (values.containsKey(NotePad.Notes.TITLE) == false) {
  128.             Resources r = Resources.getSystem();
  129.             values.put(NotePad.Notes.TITLE, r.getString(android.R.string.untitled));
  130.         }
  131.         if (values.containsKey(NotePad.Notes.NOTE) == false) {
  132.             values.put(NotePad.Notes.NOTE, “”);
  133.         }
  134.         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  135.         long rowId = db.insert(NOTES_TABLE_NAME, Notes.NOTE, values);
  136.         if (rowId > 0) {
  137.             Uri noteUri = ContentUris.withAppendedId(NotePad.Notes.CONTENT_URI, rowId);
  138.             getContext().getContentResolver().notifyChange(noteUri, null);
  139.             return noteUri;
  140.         }
  141.         throw new SQLException(“Failed to insert row into ” + uri);
  142.     }
  143.     @Override
  144.     public int delete(Uri uri, String where, String[] whereArgs) {
  145.         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  146.         int count;
  147.         switch (sUriMatcher.match(uri)) {
  148.         case NOTES:
  149.             count = db.delete(NOTES_TABLE_NAME, where, whereArgs);
  150.             break;
  151.         case NOTE_ID:
  152.             String noteId = uri.getPathSegments().get(1);
  153.             count = db.delete(NOTES_TABLE_NAME, Notes._ID + “=” + noteId
  154.                     + (!TextUtils.isEmpty(where) ? ” AND (” + where + ‘)’ : “”), whereArgs);
  155.             break;
  156.         default:
  157.             throw new IllegalArgumentException(“Unknown URI ” + uri);
  158.         }
  159.         getContext().getContentResolver().notifyChange(uri, null);
  160.         return count;
  161.     }
  162.     @Override
  163.     public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
  164.         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  165.         int count;
  166.         switch (sUriMatcher.match(uri)) {
  167.         case NOTES:
  168.             count = db.update(NOTES_TABLE_NAME, values, where, whereArgs);
  169.             break;
  170.         case NOTE_ID:
  171.             String noteId = uri.getPathSegments().get(1);
  172.             count = db.update(NOTES_TABLE_NAME, values, Notes._ID + “=” + noteId
  173.                     + (!TextUtils.isEmpty(where) ? ” AND (” + where + ‘)’ : “”), whereArgs);
  174.             break;
  175.         default:
  176.             throw new IllegalArgumentException(“Unknown URI ” + uri);
  177.         }
  178.         getContext().getContentResolver().notifyChange(uri, null);
  179.         return count;
  180.     }
  181.     static {
  182.         sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  183.         sUriMatcher.addURI(NotePad.AUTHORITY, “notes”, NOTES);
  184.         sUriMatcher.addURI(NotePad.AUTHORITY, “notes/#”, NOTE_ID);
  185.         sNotesProjectionMap = new HashMap<String, String>();
  186.         sNotesProjectionMap.put(Notes._ID, Notes._ID);
  187.         sNotesProjectionMap.put(Notes.TITLE, Notes.TITLE);
  188.         sNotesProjectionMap.put(Notes.NOTE, Notes.NOTE);
  189.         sNotesProjectionMap.put(Notes.CREATED_DATE, Notes.CREATED_DATE);
  190.         sNotesProjectionMap.put(Notes.MODIFIED_DATE, Notes.MODIFIED_DATE);
  191.     }
  192. }

http://byandby.iteye.com/blog/837466

Advertisements
This entry was posted in Android. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s