EventsProvider.java
上传用户:xmjingguan
上传日期:2009-07-06
资源大小:2054k
文件大小:5k
源码类别:

android开发

开发平台:

Java

  1. /***  * Excerpted from "Hello, Android!",  * published by The Pragmatic Bookshelf.  * Copyrights apply to this code. It may not be used to create training material,   * courses, books, articles, and the like. Contact us if you are in doubt.  * We make no guarantees that this code is fit for any purpose.   * Visit http://www.pragmaticprogrammer.com/titles/eband for more book information. ***/
  2. package org.example.events;
  3. import static android.provider.BaseColumns._ID;
  4. import static org.example.events.Constants.AUTHORITY;
  5. import static org.example.events.Constants.CONTENT_URI;
  6. import static org.example.events.Constants.TABLE_NAME;
  7. import android.content.ContentProvider;
  8. import android.content.ContentUris;
  9. import android.content.ContentValues;
  10. import android.content.UriMatcher;
  11. import android.database.Cursor;
  12. import android.database.sqlite.SQLiteDatabase;
  13. import android.net.Uri;
  14. import android.text.TextUtils;
  15. public class EventsProvider extends ContentProvider {
  16.    private static final int EVENTS = 1;
  17.    private static final int EVENTS_ID = 2;
  18.    /** The MIME type of a directory of events */
  19.    private static final String CONTENT_TYPE
  20.       = "vnd.android.cursor.dir/vnd.example.event";
  21.    /** The MIME type of a single event */
  22.    private static final String CONTENT_ITEM_TYPE
  23.       = "vnd.android.cursor.item/vnd.example.event";
  24.    private EventsData events;
  25.    private UriMatcher uriMatcher;
  26.    // ...
  27.    
  28.    
  29.    @Override
  30.    public boolean onCreate() {
  31.       uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  32.       uriMatcher.addURI(AUTHORITY, "events", EVENTS);
  33.       uriMatcher.addURI(AUTHORITY, "events/#", EVENTS_ID);
  34.       events = new EventsData(getContext());
  35.       return true;
  36.    }
  37.    
  38.    
  39.    @Override
  40.    public Cursor query(Uri uri, String[] projection,
  41.          String selection, String[] selectionArgs, String orderBy) {
  42.       if (uriMatcher.match(uri) == EVENTS_ID) {
  43.          long id = Long.parseLong(uri.getPathSegments().get(1));
  44.          selection = appendRowId(selection, id);
  45.       }
  46.       // Get the database and run the query
  47.       SQLiteDatabase db = events.getReadableDatabase();
  48.       Cursor cursor = db.query(TABLE_NAME, projection, selection,
  49.             selectionArgs, null, null, orderBy);
  50.       // Tell the cursor what uri to watch, so it knows when its
  51.       // source data changes
  52.       cursor.setNotificationUri(getContext().getContentResolver(),
  53.             uri);
  54.       return cursor;
  55.    }
  56.    
  57.    
  58.    @Override
  59.    public String getType(Uri uri) {
  60.       switch (uriMatcher.match(uri)) {
  61.       case EVENTS:
  62.          return CONTENT_TYPE;
  63.       case EVENTS_ID:
  64.          return CONTENT_ITEM_TYPE;
  65.       default:
  66.          throw new IllegalArgumentException("Unknown URI " + uri);
  67.       }
  68.    }
  69.    
  70.    
  71.    @Override
  72.    public Uri insert(Uri uri, ContentValues values) {
  73.       SQLiteDatabase db = events.getWritableDatabase();
  74.       // Validate the requested uri
  75.       if (uriMatcher.match(uri) != EVENTS) {
  76.          throw new IllegalArgumentException("Unknown URI " + uri);
  77.       }
  78.       // Insert into database
  79.       long id = db.insertOrThrow(TABLE_NAME, null, values);
  80.       // Notify any watchers of the change
  81.       Uri newUri = ContentUris.withAppendedId(CONTENT_URI, id);
  82.       getContext().getContentResolver().notifyChange(newUri, null);
  83.       return newUri;
  84.    }
  85.    
  86.    
  87.    @Override
  88.    public int delete(Uri uri, String selection,
  89.          String[] selectionArgs) {
  90.       SQLiteDatabase db = events.getWritableDatabase();
  91.       int count;
  92.       switch (uriMatcher.match(uri)) {
  93.       case EVENTS:
  94.          count = db.delete(TABLE_NAME, selection, selectionArgs);
  95.          break;
  96.       case EVENTS_ID:
  97.          long id = Long.parseLong(uri.getPathSegments().get(1));
  98.          count = db.delete(TABLE_NAME, appendRowId(selection, id),
  99.                selectionArgs);
  100.          break;
  101.       default:
  102.          throw new IllegalArgumentException("Unknown URI " + uri);
  103.       }
  104.       // Notify any watchers of the change
  105.       getContext().getContentResolver().notifyChange(uri, null);
  106.       return count;
  107.    }
  108.    
  109.    
  110.    @Override
  111.    public int update(Uri uri, ContentValues values,
  112.          String selection, String[] selectionArgs) {
  113.       SQLiteDatabase db = events.getWritableDatabase();
  114.       int count;
  115.       switch (uriMatcher.match(uri)) {
  116.       case EVENTS:
  117.          count = db.update(TABLE_NAME, values, selection,
  118.                selectionArgs);
  119.          break;
  120.       case EVENTS_ID:
  121.          long id = Long.parseLong(uri.getPathSegments().get(1));
  122.          count = db.update(TABLE_NAME, values, appendRowId(
  123.                selection, id), selectionArgs);
  124.          break;
  125.       default:
  126.          throw new IllegalArgumentException("Unknown URI " + uri);
  127.       }
  128.       // Notify any watchers of the change
  129.       getContext().getContentResolver().notifyChange(uri, null);
  130.       return count;
  131.    }
  132.    
  133.    
  134.    /** Append an id test to a SQL selection expression */
  135.    private String appendRowId(String selection, long id) {
  136.       return _ID + "=" + id
  137.             + (!TextUtils.isEmpty(selection)
  138.                   ? " AND (" + selection + ')'
  139.                   : "");
  140.    }
  141.    
  142.    
  143. }