首页 > 学院 > 开发设计 > 正文

初识ContentProvider(之Uri匹配器)

2019-11-09 16:55:33
字体:
来源:转载
供稿:网友
在上一篇博客中写到了将从另一个应用程序里获取的数据显示在控制台上,在这篇博客中将会讲如何将数据显示在listView上,而且对listView上的数据做修改操作,那么其他的删除,添加,也可以照此举一反三啦 在这之前我们补充另一个知识点,Uri匹配器,为了体现它的用途,我们会把之前获取所有的按钮在做一个区分,根据条件查询,看是查询所有还是查询单个 这是内容提供者项目中的类,我们可以看到Uri匹配器的使用方式,先实例化一个匹配器,然后给他添加规则,其中com.ccf.android_sqlite.PERSON的.PERSON是可以随意命名的 public class MyContentPPRovider extends ContentProvider {private SQLiteDatabase sqLiteDatabase;private UriMatcher uriMatcher;@Overridepublic boolean onCreate() { Log.i("test","onCreate"); DbUtil dbUtil=new DbUtil(getContext(),"student.db",null,1); sqLiteDatabase = dbUtil.getReadableDatabase(); //实例化Uri匹配器 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //添加规则 //第一种规则,查询所有 uriMatcher.addURI("com.ccf.android_sqlite.PERSON","student",1); //第二种规则,查询单个 uriMatcher.addURI("com.ccf.android_sqlite.PERSON","student/#",2);//#泛指参数的值 return false;}@Nullable@Overridepublic 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 sqLiteDatabase.query(false,"student",strings,s,strings1,null,null,s1,null); case 2: //查询单个 //获取# 的值 long id=ContentUris.parseId(uri); Log.i("test","query单个"); return sqLiteDatabase.rawQuery("select * from student where _id=?",new String[]{id+""}); } return null;}@Nullable@Overridepublic String getType(Uri uri) { Log.i("test","getType"); return null;}@Nullable@Overridepublic Uri insert(Uri uri, ContentValues values) { Log.i("test","insert"); return null;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) { Log.i("test","delete"); return 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { sqLiteDatabase.update("student",values,selection,selectionArgs); Log.i("test","update"); return 0;}}然后在内容访问者的MainActivity的查询方法,改成如下public void getAllData(View view){//在这里调用的方法,内容提供者也会调用 //判断输入框的值是否为空 if(TextUtils.isEmpty(et_main_id.getText().toString())){ //查询所有 //必须符合content协议 Toast.makeText(this, "dds", Toast.LENGTH_SHORT).show(); uri = Uri.parse("content://com.ccf.android_sqlite.PERSON/student"); }else{ //查询单个 //Uri匹配器 Toast.makeText(this, "111", Toast.LENGTH_SHORT).show(); String id=et_main_id.getText().toString(); uri = Uri.parse("content://com.ccf.android_sqlite.PERSON/student/"+id); } cursor=cr.query(uri,null,null,null,null); simpleCursorAdapter.changeCursor(cursor); while(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); }} 这样匹配器的知识点就将完了 然后就是把数据显示在listView上,我们先要在布局文件中把listView的id改成系统的,这样方便调用 然后在把Activity的继承改成继承ListActivity,就可以通过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); 然后给item设置长按事件 listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long l) { LinearLayout root= (LinearLayout) view; String id=((TextView)root.findViewById(R.id.tv_item_list_id)).getText().toString(); String name=((TextView)root.findViewById(R.id.tv_item_list_name)).getText().toString(); String 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= LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_list,null); View v = View.inflate(MainActivity.this, R.layout.dialog_list, null); final TextView tv_dialog_list_id = (TextView) v.findViewById(R.id.tv_dialog_list_id); final EditText et_dialog_list_name = (EditText) v.findViewById(R.id.et_dialog_list_name); final EditText 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) { String id=(String)tv_dialog_list_id.getText().toString().substring(3); String name=(String)et_dialog_list_name.getText().toString(); String age=(String)et_dialog_list_age.getText().toString(); ContentValues values=new ContentValues(); values.put("name",name); values.put("age",age); uri = Uri.parse("content://com.ccf.android_sqlite.PERSON/student"); cr.update(uri,values,"_id=?",new String[]{id}); //Toast.makeText(MainActivity.this, "执行修改语句", Toast.LENGTH_SHORT).show(); //关闭当前对话框 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; } });

基本上所有的关键代码都在这里了,希望能帮助到需要的人,如果有什么好的意见也可以提出来,共同进步!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表