Android ContentProvider 簡單學習

來源:互聯網
上載者:User

標籤:

當應用繼承ContentProvider類,並重寫該類用於提供資料和儲存資料的方法,就可以向其他應用共用其資料。以前我們學習過檔案的操作模式,通過指定檔案的操作模式為Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同樣可以對外共用資料,但資料的訪問方式會因資料存放區的方式而不同,如:採用xml檔案對外共用資料,需要進行xml解析來讀寫資料;採用sharedpreferences共用資料,需要使用sharedpreferences API讀寫資料。而使用ContentProvider共用資料的好處是統一了資料訪問方式。

 

1.第一步需要繼承ContentProvider並重寫下面方法:

public class PersonContentProvider extends ContentProvider{

   public boolean onCreate()

   public Uri insert(Uri uri, ContentValues values)

   public int delete(Uri uri, String selection, String[] selectionArgs)

   public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

   public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

   public String getType(Uri uri)}

2. 第二步需要在AndroidManifest.xml使用<provider>對該ContentProvider進行配置,為了能讓其他應用找到該ContentProvider , ContentProvider 採用了authorities(主機名稱/網域名稱)對它進行唯一標識,你可以把 ContentProvider看作是一個網站(想想,網站也是提供資料者),authorities 就是他的網域名稱:

<manifest .... >

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <provider android:name=".UserProvider" android:authorities="com.example.providerdemo.userProvider"/>

    </application>

</manifest>

注意:一旦應用繼承了ContentProvider類,後面我們就會把這個應用稱為ContentProvider(內容提供者)。

 

 

ProviderDemo 擁有DB, 提供Provider,供外圍進行增刪改查。 (這裡可以類比通訊錄)

OneApp對他進行 操作

provider定義:

/** *  */package com.example.providerdemo;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;/** *  * @author baoxing.gbx * @version $Id: UserProvider.java, v 0.1 2015年8月21日 上午10:25:48 baoxing.gbx Exp $ */public class UserProvider extends ContentProvider{        private DBopenHelper dbOpenHelper;    private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);    private static final int UserOne = 1;    private static final int UserList = 2;    static{        MATCHER.addURI("com.example.providerdemo.userProvider", "user", UserList);        MATCHER.addURI("com.example.providerdemo.userProvider", "user/#", UserOne);    }    @Override    public boolean onCreate() {        dbOpenHelper = new DBopenHelper(this.getContext());        return true;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,                        String sortOrder) {        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();        switch (MATCHER.match(uri)) {            case UserOne:                long key = ContentUris.parseId(uri);                String where = "id = "+ key;                if(selection!=null && !"".equals(selection.trim())){                    where += " and "+ selection;                }                Cursor cursor = db.query("user", null, where, selectionArgs, null, null, null, null);                return cursor;            case UserList:                 cursor = db.query("user", null, null, selectionArgs, null, null, null, null);                return cursor;            default:                throw new IllegalArgumentException("this is Unknown Uri:"+ uri);            }    }    @Override    public String getType(Uri uri) {        // TODO Auto-generated method stub        return null;    }    @Override    public Uri insert(Uri uri, ContentValues values) {        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();        switch (MATCHER.match(uri)) {        case UserOne:            long rowid = db.insert("user", "", values);//主索引值            Uri insertUri = ContentUris.withAppendedId(uri, rowid);            this.getContext().getContentResolver().notifyChange(uri, null);//發出資料變化通知            return insertUri;        default:            throw new IllegalArgumentException("this is Unknown Uri:"+ uri);        }    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();        int nnum = 0;        switch (MATCHER.match(uri)) {                        case UserOne:                long key = ContentUris.parseId(uri);                String where = "id = " + key;                if (null != selection && !"".equals(selection)) {                    where += "and " + selection;                }                nnum = db.delete("user", where, selectionArgs);                return nnum;                            case UserList:                nnum = db.delete("user", selection, selectionArgs);                return nnum;                        default:                throw new IllegalArgumentException("this is Unknown Uri:"+ uri);        }    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();            int nnum = 0 ;            switch (MATCHER.match(uri)) {            case UserOne:                long key = ContentUris.parseId(uri);                String where = "id = " + key;                if (null != selection && !"".equals(selection)) {                    where += "and " + selection;                }                nnum = db.update("user", values, where, selectionArgs);                return nnum;                            case UserList:                                nnum = db.update("user", values, selection, selectionArgs);                return nnum;            default:                throw new IllegalArgumentException("this is Unknown Uri:"+ uri);        }    }}

  

DB操作:

package com.example.providerdemo;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;import android.nfc.Tag;import android.os.Build.VERSION;import android.util.Log; /** * * @author baoxing.gbx * @version $Id: DBopenHelper.java, v 0.1 2015年7月11日 下午9:39:03 baoxing.gbx Exp $ */public class DBopenHelper extends SQLiteOpenHelper{     /** 資料庫名稱  */    private static final String DB_NAME = "test.db";         private static final int  VERSION = 1;         private static final String Tag = "DBopenHelper";             // 初始化資料庫開啟裝置    public DBopenHelper(Context context) {        super(context, DB_NAME, null, VERSION);        // TODO Auto-generated constructor stub    }     //    @Override    public void onCreate(SQLiteDatabase db) {        Log.i(Tag, "onCreate 被調用");        db.execSQL("create table user (id integer primary key autoincrement, name varchar(20),sex varchar(20), age integer )");    }     @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        Log.i(Tag, "onUpgrade 被調用");        db.execSQL("DROP TABLE IF EXISTS person");        onCreate(db);    } } 

  

OneApp測試

/** *  */package com.demo.oneapp.test;import java.util.Date;import android.R.integer;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.test.AndroidTestCase;import android.util.Log;/** *  * @author baoxing.gbx * @version $Id: TestProvider.java, v 0.1 2015年8月20日 下午8:50:13 baoxing.gbx Exp $ */public class TestProvider extends AndroidTestCase {        public void testAdd() {        Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user");        ContentResolver resolver = this.getContext().getContentResolver();                for (int i = 0; i < 10; ++i) {            ContentValues values = new ContentValues();             values.put("name", "muyou" + i);            values.put("sex", "男");            values.put("age", 18 + i);            Uri uri2 =  resolver.insert(uri, values);            System.out.println("完成:" + uri2);        }    }        public void testDel() {        // 查詢單個        Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user/2");        ContentResolver resolver = this.getContext().getContentResolver();                Cursor cursor = resolver.query(uri, null, null, null, null);        while (cursor.moveToNext()) {                        int id = cursor.getInt(cursor.getColumnIndex("id"));            String name = cursor.getString(cursor.getColumnIndex("name"));            String sex = cursor.getString(cursor.getColumnIndex("sex"));            int age = cursor.getInt(cursor.getColumnIndex("age"));                       Log.i("testQuery",           "id="+ id + "name=" + name + "sex=" + sex + "age=" + age);        }                 uri = Uri.parse("content://com.example.providerdemo.userProvider/user/2");         resolver = this.getContext().getContentResolver();         resolver.delete(uri, null, null);                  // 查詢單個         uri = Uri.parse("content://com.example.providerdemo.userProvider/user/2");         resolver = this.getContext().getContentResolver();                  cursor = resolver.query(uri, null, null, null, null);         while (cursor.moveToNext()) {                          int id = cursor.getInt(cursor.getColumnIndex("id"));             String name = cursor.getString(cursor.getColumnIndex("name"));             String sex = cursor.getString(cursor.getColumnIndex("sex"));             int age = cursor.getInt(cursor.getColumnIndex("age"));                         Log.i("testQuery",            "id="+ id + "name=" + name + "sex=" + sex + "age=" + age);         }    }        public void testUpdate() {        // 查詢單個        Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user/3");        ContentResolver resolver = this.getContext().getContentResolver();                Cursor cursor = resolver.query(uri, null, null, null, null);        while (cursor.moveToNext()) {                        int id = cursor.getInt(cursor.getColumnIndex("id"));            String name = cursor.getString(cursor.getColumnIndex("name"));            String sex = cursor.getString(cursor.getColumnIndex("sex"));            int age = cursor.getInt(cursor.getColumnIndex("age"));                       Log.i("testQuery",           "id="+ id + "name=" + name + "sex=" + sex + "age=" + age);        }                 uri = Uri.parse("content://com.example.providerdemo.userProvider/user/3");         resolver = this.getContext().getContentResolver();         ContentValues values = new ContentValues();         values.put("name", "cool");         resolver.update(uri, values, null, null);                  // 查詢單個         uri = Uri.parse("content://com.example.providerdemo.userProvider/user/3");         resolver = this.getContext().getContentResolver();                  cursor = resolver.query(uri, null, null, null, null);         while (cursor.moveToNext()) {                          int id = cursor.getInt(cursor.getColumnIndex("id"));             String name = cursor.getString(cursor.getColumnIndex("name"));             String sex = cursor.getString(cursor.getColumnIndex("sex"));             int age = cursor.getInt(cursor.getColumnIndex("age"));                         Log.i("testQuery",            "id="+ id + "name=" + name + "sex=" + sex + "age=" + age);         }    }            public void testQuery() {                // 查詢所有        Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user");        ContentResolver resolver = this.getContext().getContentResolver();                Cursor cursor = resolver.query(uri, null, null, null, null);        while (cursor.moveToNext()) {                        int id = cursor.getInt(cursor.getColumnIndex("id"));            String name = cursor.getString(cursor.getColumnIndex("name"));            String sex = cursor.getString(cursor.getColumnIndex("sex"));            int age = cursor.getInt(cursor.getColumnIndex("age"));                       Log.i("testQuery",           "id="+ id + "name=" + name + "sex=" + sex + "age=" + age);        }                // 查詢單個        uri = Uri.parse("content://com.example.providerdemo.userProvider/user/5");        resolver = this.getContext().getContentResolver();                cursor = resolver.query(uri, null, null, null, null);        while (cursor.moveToNext()) {                        int id = cursor.getInt(cursor.getColumnIndex("id"));            String name = cursor.getString(cursor.getColumnIndex("name"));            String sex = cursor.getString(cursor.getColumnIndex("sex"));            int age = cursor.getInt(cursor.getColumnIndex("age"));                       Log.i("testQuery",           "id="+ id + "name=" + name + "sex=" + sex + "age=" + age);        }    }        }

  

 

Android ContentProvider 簡單學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.