標籤:android android開發
內容提供者:對外共用資料,讓應用間可以訪問資料
所共用的資料是任意類型的,可以是資料庫,xml,txt檔案
統一了資料的訪問方式
1.建立一個類,繼承 ContentProvider,會重寫父類的方法
public class PersonProvider extends ContentProvider {
//當該類被執行個體化時被系統調用,只調用一次,一般用作資料初始化
@Override
public boolean onCreate() {
return false;
}
//允許外部應用程式來內容提供者查詢的操作
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
//返回要操作的資料的內容類型
@Override
public String getType(Uri uri) {
return null;
}
//允許外部應用到內容提供者插入資料
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
//允許外部應用到內容提供者刪除資料
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
//允許外部應用到內容提供者更新資料
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
}
2.在清單中配置,外界可以訪問該內容,必須是唯一標識,必須在 android系統的唯一標識,建議以公司的網域名稱為名稱,
<provider android:name=".PersonProvider" android:authorities="com.enenya.provides.personproviders" />
這個authorities是訪問的唯一標識
3.如路徑:
content://com.enenya.provides.personprovides/person/10
content:// 表示架構
com.enenyaprovides.personprovider 表示主機名稱或authorities
/person 表示路徑 (這裡的person指的是表,也可以是其它的,比如是檔案)
/10 ID
以下代碼是操作
1.先建立一個SQLiteOpenHelper操作類
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context) {
super(context, "EnenyaDB.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = " create table person ";
sql += " ( ";
sql += " personid integer primary key not null, ";
sql += " name varchar(50) null, ";
sql += " age integer null, ";
sql += " address text null ";
sql += " ) ";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" alter table person add amount integer ");
}
}
2.建立一個繼承ContentProvider類
重寫必要的方法
public class PersonProvider extends ContentProvider {
private DBOpenHelper dbOpenHelper;
// 檢測Uri是否匹配
private static final UriMatcher MATCHER = new UriMatcher(
UriMatcher.NO_MATCH);
private static final int PERSONS = 1;
static {
// 添加Uri,路勁是person,匹配碼是1
MATCHER.addURI("com.enenya.provides.personprovides", "person", PERSONS);
}
// 當該類被執行個體化時被系統調用,只調用一次,一般用作資料初始化
@Override
public boolean onCreate() {
dbOpenHelper = new DBOpenHelper(this.getContext());
return false;
}
// 允許外部應用程式來內容提供者查詢的操作
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
// 返回要操作的資料的內容類型
@Override
public String getType(Uri uri) {
return null;
}
// 允許外部應用到內容提供者插入資料
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
Uri insertUri = null;
switch (MATCHER.match(uri)) {
case 1:
long rowid = db.insert("person", "name", values);
//返回新增加的這條記錄的Uri
insertUri = Uri.parse("content://com.enenya.provides.personprovides/person/"+rowid);
//第二種 都可以
//insertUri = ContentUris.withAppendedId(uri, rowid);
break;
default:
throw new IllegalArgumentException("this is Unknown Uri:" + uri);
}
return insertUri;
}
// 允許外部應用到內容提供者刪除資料
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
//樣本暫時不寫了
return 0;
}
// 允許外部應用到內容提供者更新資料
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
//樣本不寫了
return 0;
}
}
3.從另一個應用調用這個應用的插入方法,使用內容提供者
方法為;
public void testInsert() throws Exception{
Uri uri = Uri.parse("content://com.enenya.provides.personprovides/person");
ContentResolver resolver = this.getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "張三");
values.put("age", 21);
values.put("address", "bejing city");
resolver.insert(uri, values);
}
android開發 - Content Provider 內容提供者