当前位置:   article > 正文

Android实验 ContentProvider_contentprovider的应用实验

contentprovider的应用实验

实验七 ContentProvider

一、实验目的及任务

1、ContentProvider的使用

2、Uri的使用

3、ContentResolover的使用

4、ContentObserver的使用

二、实验环境

1、Jdk

2、Android SDK

三、实验步骤

1、设计一个员工信息录入界面,当用户录入员工工号,姓名,身高等信息后支持数据的添加、删除、更新和查询等基本操作。

自定义一个ContentProvide,将这些数据暴露出去。

在另外一个应用程序中完成下面界面。当用户输入工号后,单击查询按钮,可以查找该工号的员工。支持模糊查询。

2、调用系统URI查询、添加、删除、修改联系人。

实验结果图

第一题

在这里插入图片描述

第二题

在这里插入图片描述
在这里插入图片描述

实验代码

第一题

项目目录:

​ 第一个应用的项目目录:

在这里插入图片描述

​ 第二个应用的项目目录:

在这里插入图片描述

布局代码, 数据的增删改查遇上一个实验基本相似, 不再赘述

关键代码:

内容提供者: EmpProvider.java

public class EmpProvider extends ContentProvider {

    //存放所有合法Uri的容器
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

    EmpSQLiteOpenHelper empSQLiteOpenHelper;
    private SQLiteDatabase db;

    @Override
    public boolean onCreate() {
        empSQLiteOpenHelper = new EmpSQLiteOpenHelper(getContext());
        db = empSQLiteOpenHelper.getWritableDatabase();
        matcher.addURI("com.experiment.ep7.EmpProvider","/emp",1);
        matcher.addURI("com.experiment.ep7.EmpProvider","/emp/#",2);
        return true;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s,
                        @Nullable String[] strings1, @Nullable String s1) {
        //配置URI 返回code
        int code = matcher.match(uri);
        //如果合法 进行查询
        if(code==1){    //不根据id查询
            //查什么, 条件名称是什么, 条件值是什么, groupBy, having, orderBy
            return db.query("person",strings, s, strings1, null, null, null);
        }else if(code==2){  //根据id 有参数地查询
            return db.query("emp", strings, s, strings1, null, null, s1);
        }else {         //如果不合法 抛出异常
            throw new RuntimeException("查询的URI不合法!!!");
        }
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

内容提供者需要在manifest中注册

<provider
    android:authorities="com.experiment.ep7.EmpProvider"
    android:name=".EmpProvider"
    android:exported="true"/>
  • 1
  • 2
  • 3
  • 4

内容接收者主程序:

public class MainActivity extends AppCompatActivity {

    EditText EmpId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EmpId = findViewById(R.id.EmpId);
    }

    public void query(View view){
        String empIdString = EmpId.getText().toString();
        System.out.println("EmpId:                                   "+empIdString);
        String UriString = "content://com.experiment.ep7.EmpProvider/emp/"+EmpId;//会被解析为URI2
        //得到ContentResolver对象
        ContentResolver resolver = getContentResolver();
        //调用query方法
        Uri uri = Uri.parse(UriString);
        Cursor cursor;/* = resolver.query(uri,null,null,null,null);*/
        cursor=resolver.query(uri,new String[]{"empId","name","height"},
                " empId like ?",new String[]{"%"+empIdString+"%"},"empId asc");
        System.out.println("cursor:                                 "+cursor);
        //取出cursor中的数据并显示
        if(cursor.moveToFirst()){
            do {
                String empId = cursor.getString(cursor.getColumnIndex("empId"));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String height = cursor.getString(cursor.getColumnIndex("height"));
                System.out.println("empId:             "+empId);
                System.out.println("name:              "+name);
                System.out.println("height:            "+height);
            } while (cursor.moveToNext());
        }
        cursor.close();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
第二题

项目目录:

在这里插入图片描述

首先要在项目的manifest中进行注册, 打开对联系人的读写的权限

<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
  • 1
  • 2
  • 3

主程序MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button btnA;
    Button btnB;
    Button btnC;
    Button btnD;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
        btnA = findViewById(R.id.btnA);
        btnB = findViewById(R.id.btnB);
        btnB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent();
                i.setClass(MainActivity.this , AddContactor.class);
                startActivityForResult(i,1);
            }
        });
        btnC = findViewById(R.id.btnC);
        btnC.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent();
                i.setClass(MainActivity.this , DeleteContactor.class);
                startActivityForResult(i,2);
            }
        });
        btnD = findViewById(R.id.btnD);
        btnD.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent();
                i.setClass(MainActivity.this , UpdateContactor.class);
                startActivityForResult(i,3);
            }
        });
    }

    //跳转回来
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        init();//跳回后刷新
        super.onActivityResult(requestCode, resultCode, data);
    }

    //初始化, 也做刷新
    public void init(){
        //从queryAllContactors中查询到所有的联系人
        List<Map<String,String>> listItems=queryAllContactors();
        //new一个SimpleAdapter对象用于适配 list view
        //这个对象的构造函数需要的参数包括
        //当前应用的上下文ApplicationContext
        //list view要放的 map元素(此处的元素 包含一个文件图标和一个文件名称组成的map)
        //list view所对应的layout
        //map元素 的所有的index名
        //map元素 的所有的index所对应的在list view的layout中的id, 通过这样找到位置
        SimpleAdapter simpleAdapter=new SimpleAdapter(this, listItems, R.layout.message,
                new String[]{"name","number"}, new int[]{R.id.theName,R.id.theNumber});
        ListView myList = findViewById(R.id.mylistA);//new一个list view对象,
        // 参数需要引用了这个list view的layout中这个list view的id
        //将查询到的所有的联系人相互据渲染到ListView上
        myList.setAdapter(simpleAdapter);
    }

    //查询到所有的联系人
    public List<Map<String,String>> queryAllContactors(){
        //查询得到联系人的表数据
        //ContentResolver
        ContentResolver resolver = getContentResolver();
        //执行查询得到一个Cursor
        //两个参数:
        //ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME: 查询联系人姓名
        //ContactsContract.CommonDataKinds.Phone.NUMBER: 查询联系人电话号码
        String[] projection = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
        //ContactsContract.CommonDataKinds.Phone.CONTENT_URI 是 管理联系人的URI
        Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection,
                null, null, null);
        List<Map<String,String>> listItems=new ArrayList<>();
        while (cursor.moveToNext()){
            String name = cursor.getString(0);
            String number = cursor.getString(1);
            System.out.println("访问到cursor取得的名字:        "+name);
            System.out.println("访问到cursor取得的号码:        "+number);
            Map<String, String> map = new HashMap<>();
            map.put("name", name);
            map.put("number", number);
            listItems.add(map);
        }
        cursor.close();
        return listItems;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/941078
推荐阅读
相关标签
  

闽ICP备14008679号