在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返回的數據結構,是類似JDBC的ResultSet,在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:表示表的路徑
*/
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);
}
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;
}
if(sMATCHER.match(uri)==1){
db = database.getWritableDatabase();
db.insert(Tables.table_name, Tables._id, values);
}
return null;
}
<provider android:authorities="com.liushu"
android:name=".MyContentProvider"></provider>
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必須爲完整的路徑
*/
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表