ContentProvider-----跨應用程序訪問數據

android平臺中,應用程序中的數據是私有的,其他的應用程序是不能輕易訪問的,即不能夠跨進程訪問數據。ContentProvider使得android平臺中數據得到共享,也是跨進程訪問數據的方式之一。

一、創建ContentProvider類(需要繼承ContentProvider類,重寫裏面的方法)

二、獲取ContentProvider,代碼如下:
ContentResolver contentResolver=    getContentResolver();

三、ContentResolver實例帶的方法可實現找到指定的Content provider並獲取到Content provider的數據。ContentResolver的查詢過程開始,Android系統將確定查詢所需的具體Content provider,確認它是否啓動並運行它。android系統負責初始化所有的Content provider,不需要用戶自己去創建。實際上,content provider的用戶都不可能直接訪問到content provider實例,只能通過ContentResolver在中間代理。數據模型Content provider展示數據類似一個單個數據庫表。其中:

l  每行有個帶唯一值的數字字段,名爲_ID,可用於對錶中指定記錄的定位;

l  Content provider返回的數據結構,是類似JDBCResultSet,在android中,是Cursor對象。

l  URI每個content provider定義一個唯一的公開的URI,用於指定到它的數據集。一個content provider可以包含多個數據集(可以看作多張表),這樣,就需要有多個URI與每個數據集對應。這些URI要以這樣的格式開頭:

Content:// 

 
1、 創建數據庫

一、建立數據庫類(繼承SQLiteOpenHelper,重寫onCreate方法)

二、建立表工具類(Table.java)

public class Tables {
        public final static Uri table =Uri.parse(
"content://com.liushu/s");
        public final static String table_uri = "com.liushu";
        public final static String _id="_id";
        public final static String _name="_name";
        public final static String table_name="s";
}
/**
* table:表示該表的Uri路徑
* table_uri:表示該表的主機名
* _id:表示該表的主鍵名
* _name:_name字段
* table_name:表示表的路徑
*/
三、建立ContentProvider子類(重寫ContentProvider,主要是onCreate方法)

 

1、通過onCreate方法獲取數據庫類MyDatabase

    public boolean onCreate() {

       database = new MyDatabase(getContext());

       return true;

    }

 

 

 

 

 

 

                  2、建立Uri匹配方法

private final static UriMatcher sMATCHER ;
        static{
             sMATCHER = new UriMatcher(UriMatcher.NO_MATCH);    
             sMATCHER.addURI(Tables.table_uri,Tables.table_name,1);    
             sMATCHER.addURI(Tables.table_uri,Tables.table_name+"/#",2);    
        }
    AddURI(String,String,int):第一個參數是指主機名,第二參數表示路徑名,第三個參數表示匹配後返回的值(通過match(Uri)來匹配值)。

                3、重寫增刪改查方法,下面以insert方法爲例

    public Uri insert(Uri uri, ContentValues values) {
             if(sMATCHER.match(uri)==1){
                     db = database.getWritableDatabase();
                     db.insert(Tables.table_name, Tables._id, values);
             }
                     return null;
        }
  4、配置AndroidManifest.xml

<provider android:authorities="com.liushu"    
android:name=".MyContentProvider"></provider>

             Android:authorities:定義provider的主機名,需要和Content://host:port/path/id中的host:port一樣。Android:name:定義provider類。

四、  建立Activity

1、  ContProvider是不執行方法的,而是使用ContentResolver代替他來執行。通過getContentResolver()可以獲取方法該對象。

2、  創建一個ContentValues對象,將需要插入的字段放入該對象中(key-value

3、  contentResolver對象執行insert方法

4、  代碼如下

ContentResolver contentResolver=    getContentResolver();
            ContentValues    values = new ContentValues();
            values.put(Tables._id, 2);
            values.put(Tables._name,"liushu");
            contentResolver.insert(Tables.table, values);
/**
*insert(Uri,ContentValues):Uri必須爲完整的路徑
*/
5、將該項目class文件打包成jar文件

 

五、建立B項目

 

1、  建立該項目,並且將A項目中打包成jar文件導入到該項目中

2、  Activity中寫入如下代碼:

ContentResolver contentResolver = getContentResolver();
             ContentValues values = new ContentValues();
             values.put(Tables._id, 4);
             values.put(Tables._name, "liushu");
             contentResolver.insert(Tables.table, values);

3、  執行該項目
4、  打開CMD窗口,運行adb shell命令進入模擬機linux系統中
5、  linux系統中輸入命令:
sqlite3 data/data/com.content.provider/databases/s.db
com.content.provider:包名,也就是應用程序中androidManifest.xml配置的package屬性值。
s.db:表存放的數據庫的名稱
6、  輸入命令select  * from s,查詢s
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章