ContentProvider详解一


一: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);        //SimleCursorAdapter        
	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);            
//通知适配器发生改变            
	simpleCursorAdapter.changeCursor(cursor);       
 }    }}

 
 






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值