一:ContentProvider概述
ContentProvider (内容提供者)是安卓四大组件之一,用来共享应用程序内的数据,当你需要把应用程序内的数据共享给其他应用程序使用是,才需要用到它,该组件对外提供了其他应用可以直接访问的增删改查的方法。
一旦ContentProvider暴露了自己的数据,不管应用程序是否启动,都可以直接访问
二:ContentProvider流程实现
1、自定义数据暴露
1.1自定义一个 myContentProvider类 继承ContentProvider 重写 六个方法(如下)
public class MyContentProvider extends ContentProvider { private SQLiteDatabase db; private UriMatcher uriMatcher; @Override public boolean onCreate() { Log.i("test","onCreate"); DbUtil dbUtil = new DbUtil(getContext(), "lsj.db", null, 2); db = dbUtil.getReadableDatabase(); //实例化URI匹配器 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //添加规则 //01.查询所有 content://com.zking.g150820_andorid16_sqlite.PERSON/student uriMatcher.addURI("com.lsj.administrator.myapplicatio.PERSON","student",1); //02.查询单个 content://com.zking.g150820_andorid16_sqlite.PERSON/student/3 uriMatcher.addURI("com.lsj.administrator.myapplicatio.PERSON","student/#",2); //修改 return false; } @Nullable @Override public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) { //根据URI匹配器开始匹配Uri int code=uriMatcher.match(uri); switch (code) { case 1: //查询所有 Log.i("test","query所有"); //获取数据库中所有的数据 return db.query(false,"student",strings,s,strings1,null,null,s1,null); case 2: //查询单个 //获取# 的值 long id=ContentUris.parseId(uri); Log.i("test","query单个"); return db.rawQuery("select * from student where _id=?",new String[]{id+""}); } return null; } @Nullable @Override public String getType(Uri uri) { Log.i("test","getType"); return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues contentValues) { Log.i("test","insert"); return null; } @Override public int delete(Uri uri, String s, String[] strings) { Log.i("test","delete"); return 0; } @Override public int update(Uri uri, ContentValues contentValues, String s, String[] strings) { Log.i("test","update"); int count = db.update("student",contentValues,s,strings); return count; } }
1.2 配置清单androidManifest.xml文件
android:authorities (类似于路径地址具有唯一性)android:exported (是否暴露)
<!--配置内容提供者--> <provider android:name="com.lsj.administrator.myapplicatio.provider.MyContentProvider" android:authorities="com.lsj.administrator.myapplicatio.PERSON" android:exported="true"></provider>2、访问自定义数据
2.1先获取内容访问者
2.2然后通过访问者(ContentResolver)执行增删改查操作 我写了查和修改操作
(一)查询见下我这里有三种方法
//01.直接query传参 //02.类似web http://localhost:8080/webProject/xxx.action?id=3 //03.Uri匹配器(注意加 content://规范)下面介绍一下第三种03.Uri匹配器
首先有两种情况一个查询单个 一个查询所有 然后执行查询方法 并通知适配器发生改变
到myContentProvider类 那边之后操作步骤如下 1.实例化URI匹配器 2.添加规则 3.根据URI匹配器开始匹配Uri
(二)修改 (长按修改)
cr.update(uri,values,"_id = ?",new String[]{id}); //修改
到myContentProvider类 那边之后 在重写的方法里执行修改操作int count = db.update("student",contentValues,s,strings);增、删类似就不写了
if(TextUtils.isEmpty(et_main_id.getText().toString())){ //查询所有 //http://www.baidu.com http:// //ftp: //tel: //content:// uri = Uri.parse("content://com.lsj.administrator.myapplicatio.PERSON/student"); }else{ //查询单个 //01.直接query传参 //02.类似web http://localhost:8080/webProject/xxx.action?id=3 //03.Uri匹配器 String id=et_main_id.getText().toString(); uri = Uri.parse("content://com.lsj.administrator.myapplicatio.PERSON/student/"+id); }
(如下)
public class MainActivity extends ListActivity { private ContentResolver cr; private EditText et_main_id; private Uri uri; private ListView listView; private SimpleCursorAdapter simpleCursorAdapter; private Cursor cursor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取内容访问者 cr = getContentResolver(); et_main_id = (EditText) findViewById(R.id.et_main_id); listView = getListView(); //设置适配器 simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.item_list, cursor, new String[]{"_id", "name", "age"}, new int[]{R.id.tv_item_list_id, R.id.tv_item_list_name, R.id.tv_item_list_age}); listView.setAdapter(simpleCursorAdapter); //通知适配器发生改变 simpleCursorAdapter.changeCursor(cursor); listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { private String id; private String age; private String name; private EditText et_dialog_list_age; private EditText et_dialog_list_name; public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { LinearLayout root= (LinearLayout) view; id = ((TextView)root.findViewById(R.id.tv_item_list_id)).getText().toString(); name = ((TextView)root.findViewById(R.id.tv_item_list_name)).getText().toString(); age = ((TextView)root.findViewById(R.id.tv_item_list_age)).getText().toString(); final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); final AlertDialog alertDialog=builder.create(); //点击空白处,不取消对话框 alertDialog.setCancelable(false); View v = View.inflate(MainActivity.this, R.layout.dialog_list, null); TextView tv_dialog_list_id = (TextView) v.findViewById(R.id.tv_dialog_list_id); et_dialog_list_name = (EditText) v.findViewById(R.id.et_dialog_list_name); et_dialog_list_age = (EditText) v.findViewById(R.id.et_dialog_list_age);// 确认修改部分((Button)v.findViewById(R.id.btn_dialog_list_ok)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this, "执行修改语句", Toast.LENGTH_SHORT).show(); ContentValues values = new ContentValues(); values.put("name", et_dialog_list_name.getText().toString()); values.put("age", et_dialog_list_age.getText().toString()); cr.update(uri,values,"_id = ?",new String[]{id}); //修改 simpleCursorAdapter.changeCursor(cursor); //关闭当前对话框 alertDialog.dismiss(); } }); ((Button)v.findViewById(R.id.btn_dialog_list_nook)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //关闭当前对话框 alertDialog.dismiss(); } }); tv_dialog_list_id.setText("修改:"+ id); et_dialog_list_name.setText(name); et_dialog_list_age.setText(age); alertDialog.setView(v); alertDialog.show(); return true; } }); }//查询public void getData(View view){//判断输入框的值是否为空if(TextUtils.isEmpty(et_main_id.getText().toString())){//查询所有//http://www.baidu.com http:////ftp://tel://content://uri = Uri.parse("content://com.lsj.administrator.myapplicatio.PERSON/student");}else{//查询单个//01.直接query传参//02.类似web http://localhost:8080/webProject/xxx.action?id=3//03.Uri匹配器String id=et_main_id.getText().toString();uri = Uri.parse("content://com.lsj.administrator.myapplicatio.PERSON/student/"+id); }cursor = cr.query(uri,null,null,null,null); //SimleCursorAdapterwhile (cursor.moveToNext()){int id= cursor.getInt(cursor.getColumnIndex("_id"));String name= cursor.getString(cursor.getColumnIndex("name"));int age= cursor.getInt(cursor.getColumnIndex("age"));Log.i("test",id+" "+name+" "+age);//通知适配器发生改变simpleCursorAdapter.changeCursor(cursor);} }}