使用ContentProvider共享数据

而使用ContentProvider共享数据的好处是统一了数据访问方式。
当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:


第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站(),authorities 就是他的域名:   

 这个网站以固定的Uri对外提供服务;而ContentResolver则可以当成Android系统内部的HttpClient,它可以指定Uri发送“请求”(实际是调用ContentResolver的方法),这种请求最后委托给ContentProvider处理,从而实现对“网站”(即ContentProvider)内部数据的操作。

 

 

<manifest .... >  
    <application android:icon="@drawable/icon" android:label="@string/app_name">  
        <provider android:name=".PersonContentProvider" android:authorities="com.bu3g.provider.personprovider"/>  
    </application>  
</manifest>)(想想,网站也是提供数据者),authorities 就是他的域名:  
<manifest .... >  
    <application android:icon="@drawable/icon" android:label="@string/app_name">  
        <provider android:name=".PersonContentProvider" android:authorities="com.bu3g.provider.personprovider"/>  
    </application>  
</manifest>  

 

 

Activity01 .java

public class Activity01 extends Activity  
{  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        /* 插入数据 */  
        ContentValues values = new ContentValues();  
        values.put(NotePad.Notes.TITLE, "title1");  
        values.put(NotePad.Notes.NOTE, "NOTENOTE1");  
        getContentResolver().insert(NotePad.Notes.CONTENT_URI, values);  
  
        values.clear();  
        values.put(NotePad.Notes.TITLE, "title2");  
        values.put(NotePad.Notes.NOTE, "NOTENOTE2");  
        getContentResolver().insert(NotePad.Notes.CONTENT_URI, values);  
          
        /* 显示 */  
        displayNote();  
    }  
      
    private void displayNote()  
    {  
        String columns[] = new String[] { NotePad.Notes._ID,   
                                          NotePad.Notes.TITLE,   
                                          NotePad.Notes.NOTE,   
                                          NotePad.Notes.CREATEDDATE,   
                                          NotePad.Notes.MODIFIEDDATE };  
        Uri myUri = NotePad.Notes.CONTENT_URI;  
        Cursor cur = managedQuery(myUri, columns, null, null, null);  
        if (cur.moveToFirst())  
        {  
            String id = null;  
            String title = null;  
            do  
            {  
                id = cur.getString(cur.getColumnIndex(NotePad.Notes._ID));  
                title = cur.getString(cur.getColumnIndex(NotePad.Notes.TITLE));  
                Toast toast=Toast.makeText(this, "TITLE:"+id + "NOTE:" + title, Toast.LENGTH_LONG);  
                toast.setGravity(Gravity.TOP|Gravity.CENTER, 0, 40);  
                toast.show();  
            }  
            while (cur.moveToNext());  
        }  
    }  
  
}  

  

NotePad .java

public class NotePad {  
    // ContentProvider的uri  
    public static final String AUTHORITY = "com.google.provider.NotePad";  
  
    private NotePad() {  
    }  
  
    // 定义基本字段  
    public static final class Notes implements BaseColumns {  
        private Notes() {  
        }  
  
        public static final Uri CONTENT_URI = Uri.parse("content://"  
                + AUTHORITY + "/notes");  
  
        // 新的MIME类型-多个  
        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.note";  
  
        // 新的MIME类型-单个  
        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.note";  
  
        public static final String DEFAULT_SORT_ORDER = "modified DESC";  
  
        // 字段  
        public static final String TITLE = "title";  
        public static final String NOTE = "note";  
        public static final String CREATEDDATE = "created";  
        public static final String MODIFIEDDATE = "modified";  
    }  
}  

  

NotePadProvider .java

public class NotePadProvider extends ContentProvider  
{  
    private static final String             TAG                 = "NotePadProvider";  
    // 数据库名  
    private static final String             DATABASE_NAME       = "note_pad.db";  
    private static final int                DATABASE_VERSION    = 2;  
    // 表名  
    private static final String             NOTES_TABLE_NAME    = "notes";  
    private static HashMap<String, String>    sNotesProjectionMap;  
    private static final int                NOTES               = 1;  
    private static final int                NOTE_ID             = 2;  
    private static final UriMatcher         sUriMatcher;  
    private DatabaseHelper  mOpenHelper;  
    //创建表SQL语句  
    private static final String             CREATE_TABLE="CREATE TABLE "   
                                                        + NOTES_TABLE_NAME   
                                                        + " (" + Notes._ID   
                                                        + " INTEGER PRIMARY KEY,"   
                                                        + Notes.TITLE   
                                                        + " TEXT,"   
                                                        + Notes.NOTE   
                                                        + " TEXT,"  
                                                        + Notes.CREATEDDATE   
                                                        + " INTEGER,"   
                                                        + Notes.MODIFIEDDATE   
                                                        + " INTEGER" + ");";  
      
    static  
    {  
        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);  
        sUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES);  
        sUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);  
  
        sNotesProjectionMap = new HashMap<String, String>();  
        sNotesProjectionMap.put(Notes._ID, Notes._ID);  
        sNotesProjectionMap.put(Notes.TITLE, Notes.TITLE);  
        sNotesProjectionMap.put(Notes.NOTE, Notes.NOTE);  
        sNotesProjectionMap.put(Notes.CREATEDDATE, Notes.CREATEDDATE);  
        sNotesProjectionMap.put(Notes.MODIFIEDDATE, Notes.MODIFIEDDATE);  
    }  
    private static class DatabaseHelper extends SQLiteOpenHelper  
    {  
        //构造函数-创建数据库  
        DatabaseHelper(Context context)  
        {  
            super(context, DATABASE_NAME, null, DATABASE_VERSION);  
        }  
        //创建表  
        @Override  
        public void onCreate(SQLiteDatabase db)  
        {  
            db.execSQL(CREATE_TABLE);  
        }  
        //更新数据库  
        @Override  
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)  
        {  
            db.execSQL("DROP TABLE IF EXISTS notes");  
            onCreate(db);  
        }  
    }  
    @Override  
    public boolean onCreate()  
    {  
        mOpenHelper = new DatabaseHelper(getContext());  
        return true;  
    }  
    @Override  
    //查询操作  
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)  
    {  
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();  
        switch (sUriMatcher.match(uri))  
        {  
            case NOTES:  
                qb.setTables(NOTES_TABLE_NAME);  
                qb.setProjectionMap(sNotesProjectionMap);  
                break;  
  
            case NOTE_ID:  
                qb.setTables(NOTES_TABLE_NAME);  
                qb.setProjectionMap(sNotesProjectionMap);  
                qb.appendWhere(Notes._ID + "=" + uri.getPathSegments().get(1));  
                break;  
  
            default:  
                throw new IllegalArgumentException("Unknown URI " + uri);  
        }  
        String orderBy;  
        if (TextUtils.isEmpty(sortOrder))  
        {  
            orderBy = NotePad.Notes.DEFAULT_SORT_ORDER;  
        }  
        else  
        {  
            orderBy = sortOrder;  
        }  
        SQLiteDatabase db = mOpenHelper.getReadableDatabase();  
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);  
        c.setNotificationUri(getContext().getContentResolver(), uri);  
        return c;  
    }  
    @Override  
    // 如果有自定义类型,必须实现该方法  
    public String getType(Uri uri)  
    {  
        switch (sUriMatcher.match(uri))  
        {  
            case NOTES:  
                return Notes.CONTENT_TYPE;  
  
            case NOTE_ID:  
                return Notes.CONTENT_ITEM_TYPE;  
  
            default:  
                throw new IllegalArgumentException("Unknown URI " + uri);  
        }  
    }  
    @Override  
    //插入数据库  
    public Uri insert(Uri uri, ContentValues initialValues)  
    {  
        if (sUriMatcher.match(uri) != NOTES)  
        {  
            throw new IllegalArgumentException("Unknown URI " + uri);  
        }  
        ContentValues values;  
        if (initialValues != null)  
        {  
            values = new ContentValues(initialValues);  
        }  
        else  
        {  
            values = new ContentValues();  
        }  
        Long now = Long.valueOf(System.currentTimeMillis());  
  
        if (values.containsKey(NotePad.Notes.CREATEDDATE) == false)  
        {  
            values.put(NotePad.Notes.CREATEDDATE, now);  
        }  
        if (values.containsKey(NotePad.Notes.MODIFIEDDATE) == false)  
        {  
            values.put(NotePad.Notes.MODIFIEDDATE, now);  
        }  
        if (values.containsKey(NotePad.Notes.TITLE) == false)  
        {  
            Resources r = Resources.getSystem();  
            values.put(NotePad.Notes.TITLE, r.getString(android.R.string.untitled));  
        }  
        if (values.containsKey(NotePad.Notes.NOTE) == false)  
        {  
            values.put(NotePad.Notes.NOTE, "");  
        }  
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
        long rowId = db.insert(NOTES_TABLE_NAME, Notes.NOTE, values);  
        if (rowId > 0)  
        {  
            Uri noteUri = ContentUris.withAppendedId(NotePad.Notes.CONTENT_URI, rowId);  
            getContext().getContentResolver().notifyChange(noteUri, null);  
            return noteUri;  
        }  
        throw new SQLException("Failed to insert row into " + uri);  
    }  
    @Override  
    //删除数据  
    public int delete(Uri uri, String where, String[] whereArgs)  
    {  
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
        int count;  
        switch (sUriMatcher.match(uri))  
        {  
            case NOTES:  
                count = db.delete(NOTES_TABLE_NAME, where, whereArgs);  
                break;  
  
            case NOTE_ID:  
                String noteId = uri.getPathSegments().get(1);  
                count = db.delete(NOTES_TABLE_NAME, Notes._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);  
                break;  
  
            default:  
                throw new IllegalArgumentException("Unknown URI " + uri);  
        }  
        getContext().getContentResolver().notifyChange(uri, null);  
        return count;  
    }  
    @Override  
    //更新数据  
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs)  
    {  
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
        int count;  
        switch (sUriMatcher.match(uri))  
        {  
            case NOTES:  
                count = db.update(NOTES_TABLE_NAME, values, where, whereArgs);  
                break;  
  
            case NOTE_ID:  
                String noteId = uri.getPathSegments().get(1);  
                count = db.update(NOTES_TABLE_NAME, values, Notes._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);  
                break;  
  
            default:  
                throw new IllegalArgumentException("Unknown URI " + uri);  
        }  
        getContext().getContentResolver().notifyChange(uri, null);  
        return count;  
    }  
}  

  

 

 

原文地址:https://www.cnblogs.com/firecode/p/2460882.html