ContentProvider#
ContentProvider 可以幫助應用程序管理對自己存儲的數據的訪問, 由其他應用存儲,並提供與其他應用共享數據的方法。它們封裝了數據,並提供定義數據安全性的機制。內容提供商是標準 將一個進程中的數據與另一個進程中運行的代碼連接起來的接口
ContentProvider 方法
- onCreate:創建 ContentProvider 後調用
- getType:返回當前 Uri 所代表數據的 MIME 類型
- query:用於供外部應用從 ContentProvider 中查詢數據
- insert:用於供外部應用向 ContentProvider 中增加數據
- delete:用於供外部應用從 ContentProvider 中刪除數據
- update:用於供外部應用更新 ContentProvider 中數據
首先 manifest 聲明,有兩種方式(Android 11 更新後改變了當前應用於本機其他應用進行交互的方式)保險都寫一遍
<application>
...
<provider
android:name=".MyContentProvider"
android:authorities="com.example.provider.MyContentProvider"
android:enabled="true"
android:exported="true">
</provider>
</application>
<queries>
<provider android:authorities="com.example.provider.MyContentProvider"
android:enabled="true"
android:exported="true" />
</queries>
官方文檔說明
https://developer.android.google.cn/guide/topics/providers/content-provider-creating#ContentURI
Uri#
內容 URI 是標識提供程序中的數據的 URI。內容 URI 包括 整個提供程序的符號名稱(其權限)和 指向表或文件的名稱(路徑)。可選 id 部分指向 表中的單個行。每個數據訪問方法都有一個內容 URI 作為參數;這使您可以 確定要訪問的表、行或文件
官方建議
https://developer.android.google.cn/guide/topics/providers/content-provider-creating?hl=en#kotlin
eq.
content://com.example.app.provider/table1
:調用的表。table1com.example.app
包名provider
ContentProvider java 文件名
和數據庫增刪查改類似,定義好數據庫的增刪查改,用 ContentProvider 包裝一下
如下
- mydb 中封裝 sql 操作
- ContentProvider 中調用,返回游標
- 最後使用
Provider 對應 app#
定義數據庫,創建學生表,3 個字段#
mydb.java
public class mydb extends SQLiteOpenHelper {
public mydb(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table student ("+
"id integer primary key autoincrement,name varchar,age integer)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
數據庫操作類(只寫了插入,查詢)#
mydao.java
public class mydao {
private Context context;
private SQLiteDatabase database;
public mydao(Context context){
this.context=context;
mydb dbhelper=new mydb(context,"db",null,1);
database=dbhelper.getWritableDatabase();
Log.d("qwe","getWritableDatabase");
}
public Uri Daoinsert(ContentValues contentValues){
long rowid=database.insert("student",null,contentValues);
Uri uri=Uri.parse("content://com.example.provider.MyContentProvider/student");
Uri inserturi=ContentUris.withAppendedId(uri,rowid);
context.getContentResolver().notifyChange(inserturi,null);
return inserturi;
}
public Cursor query(String[] whichone,String selection,String[] selectionArgs,String sortOrder) {
Log.d("qwe","ok");
Cursor cursor1 = database.query("student",whichone,selection,selectionArgs,
null,null,sortOrder);
return cursor1;
}
}
MYContentProvider.java
(只用了查,增操作)
public class MyContentProvider extends ContentProvider {
private mydao mydao;
public MyContentProvider() {
}
@Override
public String getType(Uri uri) {
return "1";
}
@Override
public Uri insert(Uri uri, ContentValues values) {
getContext().getContentResolver().insert(uri,values);
return mydao.Daoinsert(values);
}
@Override
public boolean onCreate() {
mydao=new mydao(this.getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return mydao.query(projection,selection,selectionArgs,sortOrder);
}
}
resovler app#
以下下查詢content://com.example.provider.MyContentProvider/student
的 age>0 的內容
註釋的地方是 insert 操作,
public class MainActivity extends AppCompatActivity {
private String d="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button_resovel);
TextView textView=findViewById(R.id.textView_resovel);
ContentResolver resolver = getContentResolver();
ContentValues values= new ContentValues();
values.put("name","sb");
values.put("age","20");
Uri uri = Uri.parse("content://com.example.provider.MyContentProvider/student");
// button.setOnClickListener(v -> resolver.insert(uri,values));
button.setOnClickListener(v -> {
Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
@SuppressLint("Range") String name = cursor.getString(cursor.
getColumnIndex("name"));
@SuppressLint("Range") int age = cursor.getInt(cursor.
getColumnIndex("age"));
@SuppressLint("Range") int id = cursor.getInt(cursor.
getColumnIndex("id"));
Log.d("db", "id=" + id + "|name=" + name + "|age=" + age);
d += ("id=" + id + "|name=" + name + "|age=" + age);
}
textView.setText(d);
}
);
}
}
結果截圖#
左邊提供者,右邊接收者