Android 中ContentProvider 和 ContentResolver使用入門

來源:互聯網
上載者:User

在Android中,我們的應用有的時候需要對外提供資料介面,可以有如下幾種方法:1)AIDL 2)Broadcast 3)ContentProvider。

使用AIDL需要我們編寫AIDL介面以及實現,而且對方也要有相應的介面描述,有點麻煩;使用Broadcast,我們不需要任何介面描述,只要協議文檔就可以了,但是有點不好就是,這種方式不直接而且是非同步;使用ContentProvider我們不需要介面描述,只需要知道協議,同時這種方式是同步的,使用方便。下面是ContentProvider實現:

package com.backgroundservice;import android.content.ContentProvider;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteQueryBuilder;import android.net.Uri;import android.util.Log;/** * TODO *  * @author tianlu * @version 1.0 Create At : 2010-2-18 下午01:58:39 */public class TestContentProvider extends ContentProvider {    private SQLiteDatabase mDb;    private DatabaseHelper mDbHelper = null;    private static final String DATABASE_NAME = "rssitems.db";    private static final String DATABASE_TABLE_NAME = "rssItems";    private static final int DB_VERSION = 1;    private static final int ALL_MESSAGES = 1;    private static final int SPECIFIC_MESSAGE = 2;    // Set up our URL matchers to help us determine what an    // incoming URI parameter is.    private static final UriMatcher URI_MATCHER;    static {        URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);        URI_MATCHER.addURI("test", "item", ALL_MESSAGES);        URI_MATCHER.addURI("test", "item/#", SPECIFIC_MESSAGE);    }    // Here's the public URI used to query for RSS items.    public static final Uri CONTENT_URI = Uri            .parse("content://test/item");    // Here are our column name constants, used to query for field values.    public static final String ID = "_id";    public static final String NAME = "NAME";    public static final String VALUE = "VALUE";    public static final String DEFAULT_SORT_ORDER = ID + " DESC";    private static class DatabaseHelper extends AbstractDatabaseHelper {        @Override        protected String[] createDBTables() {            // TODO Auto-generated method stub            String sql = "CREATE TABLE " + DATABASE_TABLE_NAME + "(" + ID                    + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT,"                    + VALUE + " TEXT);";            return new String[] { sql };        }        @Override        protected String[] dropDBTables() {            // TODO Auto-generated method stub            return null;        }        @Override        protected String getDatabaseName() {            // TODO Auto-generated method stub            return DATABASE_NAME;        }        @Override        protected int getDatabaseVersion() {            // TODO Auto-generated method stub            return DB_VERSION;        }        @Override        protected String getTag() {            // TODO Auto-generated method stub            return TestContentProvider.class.getSimpleName();        }    }    /**     *      */    public TestContentProvider() {        // TODO Auto-generated constructor stub            }    /*     * (non-Javadoc)     *      * @see android.content.ContentProvider#delete(android.net.Uri,     * java.lang.String, java.lang.String[])     */    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        // NOTE Argument checking code omitted. Check your parameters!        int rowCount = mDb.delete(DATABASE_TABLE_NAME, selection, selectionArgs);        // Notify any listeners and return the deleted row count.        getContext().getContentResolver().notifyChange(uri, null);        return rowCount;    }    /*     * (non-Javadoc)     *      * @see android.content.ContentProvider#getType(android.net.Uri)     */    @Override    public String getType(Uri uri) {        switch (URI_MATCHER.match(uri)) {        case ALL_MESSAGES:            return "vnd.android.cursor.dir/rssitem"; // List of items.        case SPECIFIC_MESSAGE:            return "vnd.android.cursor.item/rssitem"; // Specific item.        default:            return null;        }    }    /*     * (non-Javadoc)     *      * @see android.content.ContentProvider#insert(android.net.Uri,     * android.content.ContentValues)     */    @Override    public Uri insert(Uri uri, ContentValues values) {        // NOTE Argument checking code omitted. Check your parameters! Check that        // your row addition request succeeded!       long rowId = -1;       rowId = mDb.insert(DATABASE_TABLE_NAME, NAME, values);       Uri newUri = Uri.withAppendedPath(CONTENT_URI, ""+rowId);       Log.i("TestContentProvider", "saved a record " + rowId + " " + newUri);       // Notify any listeners and return the URI of the new row.       getContext().getContentResolver().notifyChange(CONTENT_URI, null);       return newUri;    }    /*     * (non-Javadoc)     *      * @see android.content.ContentProvider#onCreate()     */    @Override    public boolean onCreate() {        // TODO Auto-generated method stub        try        {            mDbHelper = new DatabaseHelper();            mDbHelper.open(getContext());            mDb = mDbHelper.getMDb();        }catch(Exception e){            e.printStackTrace();        }        return true;    }    /*     * (non-Javadoc)     *      * @see android.content.ContentProvider#query(android.net.Uri,     * java.lang.String[], java.lang.String, java.lang.String[],     * java.lang.String)     */    public Cursor query(Uri uri, String[] projection, String selection,            String[] selectionArgs, String sortOrder) {        // We won't bother checking the validity of params here, but you should!        // SQLiteQueryBuilder is the helper class that creates the        // proper SQL syntax for us.        SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();        // Set the table we're querying.        qBuilder.setTables(DATABASE_TABLE_NAME);        // If the query ends in a specific record number, we're        // being asked for a specific record, so set the        // WHERE clause in our query.        if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){            qBuilder.appendWhere("_id=" + uri.getLastPathSegment());            Log.i("TestContentProvider", "_id=" +  uri.getLastPathSegment());        }        // Make the query.        Cursor c = qBuilder.query(mDb,                projection,                selection,                selectionArgs,                null,                null,                sortOrder);        Log.i("TestContentProvider", "get records");        c.setNotificationUri(getContext().getContentResolver(), uri);        return c;    }    /*     * (non-Javadoc)     *      * @see android.content.ContentProvider#update(android.net.Uri,     * android.content.ContentValues, java.lang.String, java.lang.String[])     */    @Override    public int update(Uri uri, ContentValues values, String selection,            String[] selectionArgs) {        // NOTE Argument checking code omitted. Check your parameters!        int updateCount = mDb.update(DATABASE_TABLE_NAME, values, selection, selectionArgs);        // Notify any listeners and return the updated row count.        getContext().getContentResolver().notifyChange(uri, null);        return updateCount;    }}

設定檔如下:

<provider android:name="TestContentProvider"            android:authorities="test"></provider>

在用戶端中可以使用如下方法進行調用:

ContentValues values = new ContentValues();                values.put(TestContentProvider.NAME, "testname1");                values.put(TestContentProvider.VALUE, "testvalu1e");                Uri newAddUri = TestActivity.this.getContentResolver().insert(TestContentProvider.CONTENT_URI, values);                Cursor c = TestActivity.this.managedQuery(newAddUri, new String[]{TestContentProvider.NAME}, null, null, null);                Log.i("TestActivity", "" + c.getCount());                if(c.moveToNext())                {                    Log.i("TestActivity", c.getString(0));                }

上面的代碼是先進行插入,然後進行查詢並列印。就是如此簡單,所有的應用如果需要都可以對外方便的提供資料介面,同時其他應用也可以很方便的進行調用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.