实验要求:
- 1、contentprovider是安卓四大组件之一,请使用其方法类进行数据获取;
- 2、请自建一个provider,然后在另一个app中使用resolver调用这个provider。
实验设计:
首先我们来看看provider app,这个app首先负责创建一个sqlite数据库,然后创建好一个DAO来访问数据库,操作数据库中的数据,再用一个content provider来调用DAO中的接口来添加数据。
Provider核心代码:
DBHelper负责创建数据库。
public class MyDBHelper extends SQLiteOpenHelper {
public MyDBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
Log.d("doby", "DBHelper: 创建数据库");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
DAO中利用DBHelper来创建数据库,然后建person表。提供insert方法来提供插入数据的服务。
public class MyDAO {
private SQLiteDatabase database;
private SQLiteOpenHelper myopenhelper;
private Context context;
private Uri uri=Uri.parse("content://doby.provider");
public MyDAO(Context context){
this.context=context;
myopenhelper=new MyDBHelper(context,"dobyDB",null,1);
database=myopenhelper.getReadableDatabase();
database.execSQL("drop table if exists person");
database.execSQL("create table person(id integer primary key autoincrement,"+" name varchar, age integer)");
Log.d("doby", "已成功创建数据库。");
}
public Uri insert(Uri uri, ContentValues values){
long rowID=database.insert("person",null,values);
if(rowID == -1){
Log.d("doby","DAO: 数据插入失败");
return null;
}
else {
Uri insertUri= ContentUris.withAppendedId(uri,rowID);
Log.d("doby","ContentUris:"+insertUri.toString());
context.getContentResolver().notifyChange(insertUri,null);
return insertUri;
}
}
}
然后我们来创建content provider,主要修改了以下代码,
@Override
public boolean onCreate() {
Context context = getContext();
myDAO = new MyDAO(context);
return true;
}
public Uri insert(Uri uri, ContentValues values) {
return myDAO.insert(uri, values);
}
其中onCreate创建好DAO对象,然后在insert中通过DAO对象调用insert方法,来插入数据。
Resolver核心代码:
resolver的代码就比较简单了,直接用provider对应的uri来调用insert插入数据。resolver中是有一个按钮来运行函数的,这个按钮不重要,看看函数逻辑。
public class MainActivity extends AppCompatActivity {
private Button btn_resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_resolver = findViewById(R.id.btn_resolver);
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://doby.provider/person");
ContentValues values = new ContentValues();
values.put("name","何家健");
values.put("age",20);
btn_resolver.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
resolver.insert(uri,values);
Log.d("doby", "Resolver: 已成功插入数据。");
}
});
}
}
OK上面就是在resolver中插入数据的方法。