ContentPRovider(内容提供者)android四大基本组件之一。主要是跨应用共享数据的方式之一,ContentProvider分为自定义和系统定义,如联系人就是系统定义。
ContentProvider(内容提供者)主要方法:
public boolean onCreate()该方法在ContentProvider创建时调用public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1)查询指定的ContentProvider返回一个Cursor结果。public Uri insert(Uri uri, ContentValues contentValues)向指定的ContentProvider添加数据。public int delete(Uri uri, String s, String[] strings)向指定ContentProvider进行删除操作。public int update(Uri uri, ContentValues contentValues, String s, String[] strings)对指定ContentProvider进行修改操作。public String getType(Uri uri)返回指定ContentProvider数据类型。ContentResolver(内容访问者): 当外部应用需要使用ContentProvider时,需要通过ContentResolver来对ContentProvider进行增、删、该、查,而ContentResolver可以通过getContentResolver()方法来获取。
在访问者应用中还需要定义Uri,Uri的定义必须规范如: “content://com.example.myandrioid_24.PERSON” 其中content://与http://类似
下面是ContentProvider+ContentResolver+ListView实现的简单示例:
ContentProvider(内容提供者):
private SQLiteDatabase db; @Override public boolean onCreate() { DBHelper dbHelper=new DBHelper(getContext(),"person.db",null,2); db = dbHelper.getReadableDatabase(); return false; } @Nullable @Override public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) { return db.query(false,"person",strings,s,strings1,null,null,null,null); } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues contentValues) { db.insert("person",null,contentValues); return uri; } @Override public int delete(Uri uri, String s, String[] strings) { return db.delete("person",s,strings); } @Override public int update(Uri uri, ContentValues contentValues, String s, String[] strings) { return db.update("person",contentValues,s,strings); }提供者应用清单文件:
<!-- com.example.myandrioid_24内容提供者的包名 PERSON为自定义名 --><!-- 内容提供者包名加类名com.provider.MyPersonProvider --><!-- exported是否允许访问 --> <provider android:authorities="com.example.myandrioid_24.PERSON" android:name="com.provider.MyPersonProvider" android:exported="true"></provider>ContentResolver(内容访问者):
private EditText et_main_id; private EditText et_main_name; private EditText et_main_age; private ContentResolver cr; private Uri uri; private ListView lv_main_list; private SimpleCursorAdapter simpleCursorAdapter; private Cursor cursor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取控件 et_main_id = (EditText)findViewById(R.id.et_main_id); et_main_name = (EditText)findViewById(R.id.et_main_name); et_main_age = (EditText)findViewById(R.id.et_main_age); lv_main_list = (ListView) findViewById(R.id.lv_main_list); //获取内容提供者 cr = getContentResolver(); //获取内容提供者地址 uri = Uri.parse("content://com.example.myandrioid_24.PERSON"); //通过内容提供者获取Cursor cursor = cr.query(uri,null,null,null,null); //设置listView适配器 simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.item_list_view, cursor,new String[]{"_id","name","age"},new int[]{R.id.tv_item_id,R.id.tv_item_name,R.id.tv_item_age}); lv_main_list.setAdapter(simpleCursorAdapter); //listView点击事件 lv_main_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { //获取当前点击的值 LinearLayout linearLayout= (LinearLayout) view; final String id=((TextView)linearLayout.findViewById(R.id.tv_item_id)).getText().toString(); final String name=((TextView)linearLayout.findViewById(R.id.tv_item_name)).getText().toString(); final String age=((TextView)linearLayout.findViewById(R.id.tv_item_age)).getText().toString(); //弹出对话框(自定义) final AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); final AlertDialog dialog=builder.create(); //设置点击空白,不取消对话框 dialog.setCancelable(false); //解析布局文件 final View v=getLayoutInflater().inflate(R.layout.my_dialog,null); ((TextView)v.findViewById(R.id.tv_my_dialog_id)).setText("修改:"+id); ((EditText)v.findViewById(R.id.et_my_dialog_name)).setText(name); ((EditText)v.findViewById(R.id.et_my_dialog_age)).setText(age); //确定修改 ((Button)v.findViewById(R.id.btn_my_dialog_ok)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //获取修改的值 final String names=((EditText)v.findViewById(R.id.et_my_dialog_name)).getText().toString(); final String ages=((EditText)v.findViewById(R.id.et_my_dialog_age)).getText().toString(); // ContentValues contentValues=new ContentValues();//Map contentValues.put("name",names); contentValues.put("age",ages); cr.update(uri,contentValues,"_id=?",new String[]{id}); //添加后更新数据 cursor=cr.query(uri,null,null,null,null); //通知适配器发生改变 simpleCursorAdapter.changeCursor(cursor); //关闭弹出框 dialog.dismiss(); } }); //取消修改 ((Button)v.findViewById(R.id.btn_my_dialog_no)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); } }); dialog.setView(v); dialog.show(); } }); } //添加的方法 public void getInsert(View view){ if (TextUtils.isEmpty(et_main_name.getText().toString())&&TextUtils.isEmpty(et_main_age.getText().toString())) { //获取添加的值 String name=et_main_name.getText().toString(); int age=Integer.parseInt(et_main_age.getText().toString()); //添加的值 ContentValues values=new ContentValues(); values.put("name",name); values.put("age",age); //主键自动增长,所以不能手动赋值 values.putNull("_id"); //调添加的方法 cr.insert(uri,values); //添加后更新数据 cursor=cr.query(uri,null,null,null,null); //通知适配器发生改变 simpleCursorAdapter.changeCursor(cursor); }else { Toast.makeText(this, "名字、年龄不能为空", Toast.LENGTH_SHORT).show(); } } //删除的方法 public void getDelete(View view){ int id=Integer.parseInt(et_main_id.getText().toString()); //判断id是否为空 if (TextUtils.isEmpty(et_main_id.getText().toString())) { cr.delete(uri,"_id=?",new String[]{id+""}); //删除后更新数据 cursor=cr.query(uri,null,null,null,null); //通知适配器发生改变 simpleCursorAdapter.changeCursor(cursor); }else{ Toast.makeText(this, "ID不能为空", Toast.LENGTH_SHORT).show(); } }
新闻热点
疑难解答