1.ContentProvider是Android四大组件之一,其特点是能够实现进程间应用程序的共享。
2.数据在Android的应用程序中是私有的,该类数据包括文件数据、数据库数据以及其他类型的数据。因此要进行数据间的共享及传递数据,就要创建一个ContentProvider。因为一个ContentProvider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此ContentProvider的各种数据类型,即一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据暴露出去。
解决问题需要运用知识点:ContentProvider的使用,进程内数据共享,进程间数据共享,自定义权限。
定义:ContentProvider是操作其他应用程序内容的组件
内涵:可以操作其他运用程序,运用间数据共享
如何定义内容提供者:
内容提供方:ContentProvider
内容获取放:ContentResolver
谈到内容提供者,大家就应该想到提供方和索要方,之前我们获取手机联系人,提供方是系统APP本身,索要方是我们;现在,我们想要做提供方,别人来访问我们的数据库,那我们就需要自定义内容提供者了。
(1)数据库默认是私有的,不能被其他app访问,只能通过内容提供者访问
(2)内容提供者是安卓的四大组件之一,必须在清单文件中注册
思路:
1.提供方moudle:ContentProvider
(1)创建数据库,自定义类继承SQLiteOpenHelper
(2)自定义内容提供者类,继承ContentProvider,重写insert/delete/update/query方法,向外界提供方法
(3)清单文件中注册内容提供者 第2步和第3步可以通过快捷键生成
2.索要方moudle:ContentResolver
(1)通过Context的getContentResolver方法获得ContentResolver对象
(2)确定uri(注意:前面一定要加conten://)
(3)调用insert/delete/update/query方法访问数据库
自定义权限使用场景
定义权限一般用于暴露出去的组件,提高安全性。Android允许一个应用(客户端)调用另一个应用(服务端)的组件。那么作为服务端的应用就得暴露相应的组件,客户端应用才能访问。当然,在暴露的时候,权限是非必须的,如果暴露的组件没有权限的话,那么任何的其他应用都可以来调用该组件;如果该组件申请了权限,那么只有拥有该权限的应用才能调用该组件。
MySqlite mySqlite;
SQLiteDatabase sqLiteDatabase;
public MyContentProvider() {
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// Implement this to handle requests to delete one or more rows.
int stu = sqLiteDatabase.delete("stu", selection, selectionArgs);
return stu;
}
@Override
public String getType(Uri uri) {
// TODO: Implement this to handle requests for the MIME type of the data
// at the given URI.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO: Implement this to handle requests to insert a new row.
sqLiteDatabase.insert("stu",null,values);
return uri;
}
@Override
public boolean onCreate() {
mySqlite = new MySqlite(getContext(),"stu.db",null,1);
sqLiteDatabase = mySqlite.getReadableDatabase();
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO: Implement this to handle query requests from clients.
Cursor stu = sqLiteDatabase.query("stu", projection, selection, selectionArgs, null, null, sortOrder);
return stu;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO: Implement this to handle requests to update one or more rows.
int stu = sqLiteDatabase.update("stu", values, selection, selectionArgs);
return stu;
}
ContentResolver contentResolver;
Uri uri;
private ListView lv;
List<Student> students;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentResolver = getContentResolver();
uri = Uri.parse("content://com.bw.stu");
lv = findViewById(R.id.lv);
}
public void insert(View view) {
ContentValues contentValues = new ContentValues();
contentValues.put("name","牛马韩");
contentValues.put("phone","54250");
contentResolver.insert(uri,contentValues);
}
public void update(View view) {
ContentValues contentValues = new ContentValues();
contentValues.put("name","阿巴阿巴");
contentResolver.update(uri,contentValues,"name=?",new String[]{"牛马韩"});
}
public void delete(View view) {
contentResolver.delete(uri,"name=?",new String[]{"牛马韩"});
}
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
public void query(View view) {
students = new ArrayList<>();
Cursor query = contentResolver.query(uri, null, null, null, null,null);
if (query!=null){
while (query.moveToNext()) {
String name = query.getString(query.getColumnIndexOrThrow("name"));
String phone = query.getString(query.getColumnIndexOrThrow("phone"));
Student student = new Student(name,phone);
students.add(student);
}
}
MyAdapter myAdapter = new MyAdapter();
lv.setAdapter(myAdapter);
}
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return students.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,null);
TextView name = view.findViewById(R.id.name);
TextView phone = view.findViewById(R.id.phone);
name.setText(students.get(i).getName());
phone.setText(students.get(i).getPhone());
return view;
}
}