第9天自定義內容提供者
阿新 • • 發佈:2018-12-26
第9天自定義內容提供者
自定義內容提供者
一.什麼是自定義內容提供者
談到內容提供者,大家就應該想到提供方和索要方,之前我們獲取手機聯絡人,提供方是系統APP本身,索要方是我們;現在,我們想要做提供方,別人來訪問我們的資料庫,那我們就需要自定義內容提供者了。
二.思路:
1.提供方:ContentProvider
(1)建立資料庫,自定義類繼承SQLiteOpenHelper
(2)自定義內容提供者類,繼承ContentProvider,重寫insert/delete/update/query方法,向外界提供方法
(3)清單檔案中註冊內容提供者,
2.索要方:ContentResolver
(1)通過Context的getContentResolver方法獲得ContentResolver物件
(2)確定uri
(3)呼叫insert/delete/update/query方法訪問資料庫
三.提供者程式碼:建立my_contentprovider moudle
(1)自定義類繼承SQLiteOpenHelper
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context) {
super(context, "user.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user (_id integer primary key autoincrement ,name varchar(30),age integer)" );
for(int i=1;i<10;i++){
db.execSQL("insert into user values(null,?,?)",new String[]{"總定型"+i+"",i+""});
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
(2)自定義內容提供者類,繼承ContentProvider
public class MyProvider extends ContentProvider {
private MyHelper myHelper;
private SQLiteDatabase db;
//獲取資料庫
@Override
public boolean onCreate() {
myHelper=new MyHelper(getContext());
db=myHelper.getWritableDatabase();
if(db==null){
return false;
}else{
return true;
}
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
return db.query("user",projection,selection,selectionArgs,null,null,sortOrder);
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
db.insert("user",null,values);
return uri;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return db.delete("user",selection,selectionArgs);
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return db.update("user",values,selection,selectionArgs);
}
}
(3)清單檔案中註冊內容提供者
<!--註冊內容提供者 exported能否被其他應用程式訪問 authorities:uri name:類的全路徑-->
<provider
android:exported="true"
android:authorities="com.bawei"
android:name=".MyProvider"></provider>
注意:清單檔案中authorities屬性就是索要方的uri:com.bawei
四.內容索要方程式碼
(1)獲取ContentResolver直接獲取
確定Uri:conten://com.bawei 前面一定要加conten://
public class MainActivity extends AppCompatActivity {
private ContentResolver contentResolver;
private Uri uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uri=Uri.parse("content://com.bawei");
contentResolver=getContentResolver();
}
//user (_id integer primary key autoincrement ,name varchar(30),age integer)
public void query(){
//引數一:uri 引數二:查詢的欄位 引數三:條件 引數四:為?賦值 引數五:排序
Cursor cursor=contentResolver.query(uri,new String[]{"_id","name"},null,null,null);
//遍歷
}
public void delete(){
//引數一:uri 引數二:條件 引數三:為?賦值
int raw=contentResolver.delete(uri,"name=?",new String[]{"要甜雪"});
}
public void insert(){
//新增資料
ContentValues contentValues=new ContentValues();
contentValues.put("name","要甜雪");
contentValues.put("age",18);
contentResolver.insert(uri,contentValues);
//遍歷
}
}