今天学习ContentResolver的时候又用到了ListView这个控件,好多东西又忘了,看了看书,才想起来了
数据是无法直接传递给ListView的,需要通过适配器来完成,可用ArrayAdapter或自定义适配器来继承ArrayAdapter来构建适配器
private List<Fruit> fruitlist=new ArrayList<Fruit>();
FruitAdapter adapter=new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitlist);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
FruitAdapter是自定义的适配器,继承ArrayAdapter,里面的参数分别是1.上下文,2.需要传入的布局,3.要传入的数据(可以直接传入,通常是后续传入,这里只是写上List类的名字)
然后通过listView.setAdapter(adapter);方法,把构建好的适配器对象传递进去,这样ListView和数据之间就建立了联系。
今天写的ContentResolver,通过内容提供器访问外部接口
想要访问内容提供器中共享的数据,需要借助ContentResolver类,可以通过Context中的getContentResolver()方法来获取该类的实例。
ContentResolver提供了一系列的方法来对数据进行CRUD操作,但又有不同,传的参数不是表名,而是用Uri参数代替,Uri由两部分组成,权限(authority)和路径(path),权限是用于区分不同的程序,路径是用于区分同一应用程序中的不同的表。权限一般采用的是包名+provider,路径就是表的名称。
例如内容URI最标准的格式为:content://com.example.app.provider/table1
很显然,URI很清楚的表达了我们要访问哪个程序的哪张表,得到URI字符串之后,还需要解析成Uri对象,调用Uri.parse()方法。
Uri uri=Uri.parse("content://com.example.app.provider/table1");
查询:
之后就可以使用Uri对象来查询table中的数据了Cursor cursor=getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
后面几个是约束条件,用的时候查一下就好了
ContentValues values=new ContentValues();
values.put("colum1","text");
增加:
getContentResolver().insert(uri,values);
更新:
getContentResolver().update(uri,values,"colum1=?",new String[]{"text"});
删除:
getContentResolver().delete(uri,values,"colum1=?",new String[]{"text"});
例子:
读取联系人
public class MainActivity extends Activity {
ListView contactsView;
ArrayAdapter<String> adapter;
List<String> contactsList=new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactsView=(ListView) findViewById(R.id.contact_view);
adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,contactsList);
contactsView.setAdapter(adapter);
readContacts();
}
private void readContacts() {
Cursor cursor=null;
try {
cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
String displayName=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add(displayName+"\n"+number);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(cursor!=null){
cursor.close();
}
}
}
}
readContacts()上面的就是在本文最上面写的,
Uri没用是因为ContactsContract.CommonDataKinds.Phone类已经做好了封装,提供CONTENT_URI常量,它就是Uri.prase()方法解析出来的结果,然后通过遍历,把姓名和手机号取出来,姓名对应的常量是ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,手机号对应的常量是ContactsContract.CommonDataKinds.Phone.NUMBER,之后添加到LiewView对象里面,最后一定要记得吧Cursor对象关闭
之后在AndroidManifest.xml文件中添加权限即可
<uses-permission android:name="android.permission.READ_CONTACTS"/>
以上是采用现有的内容提供器来读取和操作相应应用程序中的数据