xiechengfa 发表于 2013-1-26 15:14:47

Android中ContentProvider和ContentResolver使用入门

<span style="border-collapse: separate; color: #000000; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; white-space: normal; font-size: medium;" class="Apple-style-span"><span style="color: #4b4b4b; font-family: Verdana,Geneva,Arial,Helvetica,sans-serif; font-size: 13px; line-height: 19px;" class="Apple-style-span">在Android中,我们的应用有的时候需要对外提供数据接口,可以有如下几种方法:1)AIDL 2)Broadcast 3)ContentProvider。
使用AIDL需要我们编写AIDL接口以及实现,而且对方也要有相应的接口描述,有点麻烦;使用Broadcast,我们不需要任何接口描述,只要协议文档就可以了,但是有点不好就是,这种方式不直接而且是异步的;使用ContentProvider我们不需要接口描述,只需要知道协议,同时这种方式是同步的,使用方便。下面是ContentProvider实现:
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 1006px; font-size: 13px;">http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockStart.gif/**
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif * 
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockEnd.gif */
http://www.agoit.com/Images/OutliningIndicators/None.gifpackage com.backgroundservice;
http://www.agoit.com/Images/OutliningIndicators/None.gif
http://www.agoit.com/Images/OutliningIndicators/None.gifimport android.content.ContentProvider;
http://www.agoit.com/Images/OutliningIndicators/None.gifimport android.content.ContentValues;
http://www.agoit.com/Images/OutliningIndicators/None.gifimport android.content.UriMatcher;
http://www.agoit.com/Images/OutliningIndicators/None.gifimport android.database.Cursor;
http://www.agoit.com/Images/OutliningIndicators/None.gifimport android.database.sqlite.SQLiteDatabase;
http://www.agoit.com/Images/OutliningIndicators/None.gifimport android.database.sqlite.SQLiteQueryBuilder;
http://www.agoit.com/Images/OutliningIndicators/None.gifimport android.net.Uri;
http://www.agoit.com/Images/OutliningIndicators/None.gifimport android.util.Log;
http://www.agoit.com/Images/OutliningIndicators/None.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockStart.gif/**
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif * TODO
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif * 
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif * @author tianlu
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif * @version 1.0 Create At : 2010-2-18 下午01:58:39
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockEnd.gif */
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockStart.gifpublic class TestContentProvider extends ContentProvider {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    private SQLiteDatabase mDb;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    private DatabaseHelper mDbHelper = null;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    private static final String DATABASE_NAME = "rssitems.db";
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    private static final String DATABASE_TABLE_NAME = "rssItems";
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    private static final int DB_VERSION = 1;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    private static final int ALL_MESSAGES = 1;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    private static final int SPECIFIC_MESSAGE = 2;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    // Set up our URL matchers to help us determine what an
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    // incoming URI parameter is.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    private static final UriMatcher URI_MATCHER;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    static {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        URI_MATCHER.addURI("test", "item", ALL_MESSAGES);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        URI_MATCHER.addURI("test", "item/#", SPECIFIC_MESSAGE);
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    // Here's the public URI used to query for RSS items.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    public static final Uri CONTENT_URI = Uri
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            .parse("content://test/item");
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    // Here are our column name constants, used to query for field values.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    public static final String ID = "_id";
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    public static final String NAME = "NAME";
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    public static final String VALUE = "VALUE";
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    public static final String DEFAULT_SORT_ORDER = ID + " DESC";
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    private static class DatabaseHelper extends AbstractDatabaseHelper {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        @Override
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif        protected String[] createDBTables() {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            // TODO Auto-generated method stub
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            String sql = "CREATE TABLE " + DATABASE_TABLE_NAME + "(" + ID
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif                    + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT,"
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif                    + VALUE + " TEXT);";
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif            return new String[] { sql };
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        @Override
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif        protected String[] dropDBTables() {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            // TODO Auto-generated method stub
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            return null;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        @Override
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif        protected String getDatabaseName() {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            // TODO Auto-generated method stub
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            return DATABASE_NAME;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        @Override
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif        protected int getDatabaseVersion() {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            // TODO Auto-generated method stub
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            return DB_VERSION;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        @Override
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif        protected String getTag() {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            // TODO Auto-generated method stub
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            return TestContentProvider.class.getSimpleName();
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    /**
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * 
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif     */
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    public TestContentProvider() {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // TODO Auto-generated constructor stub
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    /*
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * (non-Javadoc)
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * 
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * @see android.content.ContentProvider#delete(android.net.Uri,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * java.lang.String, java.lang.String[])
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif     */
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    @Override
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    public int delete(Uri uri, String selection, String[] selectionArgs) {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // NOTE Argument checking code omitted. Check your parameters!
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        int rowCount = mDb.delete(DATABASE_TABLE_NAME, selection, selectionArgs);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // Notify any listeners and return the deleted row count.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        getContext().getContentResolver().notifyChange(uri, null);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        return rowCount;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    /*
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * (non-Javadoc)
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * 
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * @see android.content.ContentProvider#getType(android.net.Uri)
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif     */
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    @Override
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    public String getType(Uri uri) {
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif        switch (URI_MATCHER.match(uri)) {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        case ALL_MESSAGES:
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            return "vnd.android.cursor.dir/rssitem"; // List of items.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        case SPECIFIC_MESSAGE:
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            return "vnd.android.cursor.item/rssitem"; // Specific item.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        default:
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            return null;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    /*
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * (non-Javadoc)
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * 
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * @see android.content.ContentProvider#insert(android.net.Uri,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * android.content.ContentValues)
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif     */
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    @Override
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    public Uri insert(Uri uri, ContentValues values) {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // NOTE Argument checking code omitted. Check your parameters! Check that
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // your row addition request succeeded!
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif       long rowId = -1;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif       rowId = mDb.insert(DATABASE_TABLE_NAME, NAME, values);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif       Uri newUri = Uri.withAppendedPath(CONTENT_URI, ""+rowId);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif       Log.i("TestContentProvider", "saved a record " + rowId + " " + newUri);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif       // Notify any listeners and return the URI of the new row.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif       getContext().getContentResolver().notifyChange(CONTENT_URI, null);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif       return newUri;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    /*
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * (non-Javadoc)
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * 
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * @see android.content.ContentProvider#onCreate()
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif     */
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    @Override
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    public boolean onCreate() {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // TODO Auto-generated method stub
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        try
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif        {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            mDbHelper = new DatabaseHelper();
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            mDbHelper.open(getContext());
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            mDb = mDbHelper.getMDb();
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif        }catch(Exception e){
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            e.printStackTrace();
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        return true;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    /*
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * (non-Javadoc)
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * 
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * @see android.content.ContentProvider#query(android.net.Uri,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * java.lang.String[], java.lang.String, java.lang.String[],
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * java.lang.String)
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif     */
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    public Cursor query(Uri uri, String[] projection, String selection,
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif            String[] selectionArgs, String sortOrder) {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // We won't bother checking the validity of params here, but you should!
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // SQLiteQueryBuilder is the helper class that creates the
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // proper SQL syntax for us.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // Set the table we're querying.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        qBuilder.setTables(DATABASE_TABLE_NAME);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // If the query ends in a specific record number, we're
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // being asked for a specific record, so set the
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // WHERE clause in our query.
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif        if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            qBuilder.appendWhere("_id=" + uri.getLastPathSegment());
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif            Log.i("TestContentProvider", "_id=" +  uri.getLastPathSegment());
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // Make the query.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        Cursor c = qBuilder.query(mDb,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif                projection,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif                selection,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif                selectionArgs,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif                null,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif                null,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif                sortOrder);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        Log.i("TestContentProvider", "get records");
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        c.setNotificationUri(getContext().getContentResolver(), uri);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        return c;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif    /*
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * (non-Javadoc)
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * 
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * @see android.content.ContentProvider#update(android.net.Uri,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif     * android.content.ContentValues, java.lang.String, java.lang.String[])
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif     */
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    @Override
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif    public int update(Uri uri, ContentValues values, String selection,
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif            String[] selectionArgs) {
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // NOTE Argument checking code omitted. Check your parameters!
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        int updateCount = mDb.update(DATABASE_TABLE_NAME, values, selection, selectionArgs);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        // Notify any listeners and return the updated row count.
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        getContext().getContentResolver().notifyChange(uri, null);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif        return updateCount;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockEnd.gif}
http://www.agoit.com/Images/OutliningIndicators/None.gif
页: [1]
查看完整版本: Android中ContentProvider和ContentResolver使用入门