介绍
1、ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能。
2、三个重点
(1) contentProvider 内容提供者
(2) contentResolve 内容解析者
(3) uri 地址
简单的理解:内容提供者提供一个地址,内容解析者把uri解析一下,去指向提供者的地址.。
思路
1.提供方:ContentProvider
(1)创建数据库,自定义类继承SQLiteOpenHelper
(2)自定义内容提供者类,继承ContentProvider,重写insert/delete/update/query方法,向外界提供方法
(3)清单文件中注册内容提供者
2.索要方:ContentResolver
(1)通过Context的getContentResolver方法获得ContentResolver对象
(2)确定uri
(3)调用insert/delete/update/query方法访问数据库
代码展示
自定义内容提供者类,继承ContentProvider
public class MyContentProvider extends ContentProvider {
private SQLiteDatabase db;
private MySqlHelper mySqlHelper;
public MyContentProvider() {
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// Implement this to handle requests to delete one or more rows.
int student = db.delete("student", selection, selectionArgs);
return student;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
db.insert("student",null,values);
return uri;
}
@Override
public boolean onCreate() {
//获取能操作这个表的MySqlHelper对象
mySqlHelper = new MySqlHelper(getContext(),"student.db",null,1);
db = mySqlHelper.getReadableDatabase();
if(db != null){
return true;
}
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor student = db.query("student", projection, selection, selectionArgs, null, null, sortOrder);
return student;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int student = db.update("student", values, selection, selectionArgs);
return student;
}
}
一键创建
索要方代码
public class MainActivity extends AppCompatActivity {
private Button insert;
private Button delete;
private Button update;
private Button select;
private ContentResolver contentResolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
insert = (Button) findViewById(R.id.insert);
delete = (Button) findViewById(R.id.delete);
update = (Button) findViewById(R.id.update);
select = (Button) findViewById(R.id.select);
//得到一个解析者,去访问提供者的数据库
contentResolver = getContentResolver();
//创建一个uri对象
final Uri uri = Uri.parse("content://com.huang.1712A");
//增加数据
insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ContentValues contentValues = new ContentValues();
contentValues.put("name","开机");
contentResolver.insert(uri,contentValues);
}
});
//删除数据
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ContentValues contentValues = new ContentValues();
contentResolver.delete(uri,"id=?",new String[]{"4"});
}
});
//修改数据
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ContentValues contentValues = new ContentValues();
contentValues.put("name","4444");
contentResolver.update(uri,contentValues,"id=?",new String[]{"6"});
}
});
//查询数据
select.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//参数一:uri 参数二:查询的字段 参数三:条件 参数四:为?赋值 参数五:排序
Cursor cursor = contentResolver.query(uri, new String[]{"id", "name"}, null, null, null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String id = cursor.getString(cursor.getColumnIndex("id"));
Toast.makeText(MainActivity.this, id+name, Toast.LENGTH_SHORT).show();
}
}
});
}
}
自定义权限
创建自定义权限并在提供者中绑定
<?xml version="1.0" encoding="utf-8"?>
< manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.a3_2_sqlite_shu_ju_ku">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
//在provider中添加你写的 读写 权限 绑定
<provider
android:readPermission="com.bawei.permission.READ"
android:writePermission="com.bawei.permission.WRITE"
android:name=".MyContentProvider"
android:authorities="com.huang.1712A"
android:enabled="true"
android:exported="true"></provider>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
//自定义权限 读的权限
<permission android:name="com.bawei.permission.READ" android:protectionLevel="normal">
</permission>
//自定义权限 写的权限
<permission android:name="com.bawei.permission.WRITE" android:protectionLevel="normal">
</permission>
</manifest>
解析方清单文件中添加权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.a3_2_contentprovider">
//添加读写的权限
<uses-permission android:name="com.bawei.permission.READ"></uses-permission>
<uses-permission android:name="com.bawei.permission.WRITE"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>