初识ContentProvider(之Uri匹配器)

    在上一篇博客中写到了将从另一个应用程序里获取的数据显示在控制台上,在这篇博客中将会讲如何将数据显示在listView上,而且对
listView上的数据做修改操作,那么其他的删除,添加,也可以照此举一反三啦
  在这之前我们补充另一个知识点,Uri匹配器,为了体现它的用途,我们会把之前获取所有的按钮在做一个区分,根据条件查询,看是查询所有还是查询单个
  这是内容提供者项目中的类,我们可以看到Uri匹配器的使用方式,先实例化一个匹配器,然后给他添加规则,其中com.ccf.android_sqlite.PERSON的.PERSON是可以随意命名的
 public class MyContentPprovider extends ContentProvider {

private SQLiteDatabase sqLiteDatabase;
private UriMatcher uriMatcher;

@Override
public 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
@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 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
@Override
public String getType(Uri uri) {
    Log.i("test","getType");
    return null;
}

@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
    Log.i("test","insert");
    return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    Log.i("test","delete");
    return 0;
}

@Override
public 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;
            }
        });

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值