赞
踩
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; } }
内容提供者需要在manifest中注册
<provider
android:authorities="com.experiment.ep7.EmpProvider"
android:name=".EmpProvider"
android:exported="true"/>
内容接收者主程序:
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(); } }
项目目录:
首先要在项目的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"/>
主程序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; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。