实现步骤
1.创建工程,写布局文件,写ListView布局展示联系人,两个button代表获取联系人和插入联系人
2.封装Utils工具类,封装获取联系人的方法,将结果封装到Contacts对象中存放到list集合用于ListView展示
public class ContactsUtils {
//查询联系人
//以后谁调这个方法谁就传一个context进来
public static ArrayList<Contacts> queryContacts(Context context){
//0 创建一个集合,将数据放到集合中
ArrayList<Contacts> arrayList = new ArrayList<Contacts>();
// 1 通过uri解析器获取内容
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
// 2 查询内容 projection:查询什么内容 selection:根据什么查 selectionArgs:参数 sortOrder:排序
// 先查询row_contacts表的contact_id列 我们就知道一共有几条联系人
Cursor cursor = context.getContentResolver().query(uri,
new String[] { "contact_id" }, null, null, null);
while (cursor.moveToNext()) {
String contact_id = cursor.getString(0);
//创建Contacts对象
Contacts contact = new Contacts();
//将contact_id封装到contact对象中
contact.setContact_id(contact_id);
/*
* contact_id就是data表的raw_contact_id,根据raw_contact_id查询data1和mimetype_id
*
* 当我们查data表的时候,其实查的是view_data视图,里面没有mimetype_id,只有mimetype
*
* mimetype代表的是代码(例如名字代码是 vnd.android.cursor.item/name)
*
* data1代表的内容(例如名字,电话等)
*/
//3 根据contact_id去查询data表 查询data1列和mimetype
Uri dataUri = Uri.parse("content://com.android.contacts/data");
Cursor dataCursor = context.getContentResolver().query(dataUri,
new String[] { "data1", "mimetype" }, "raw_contact_id=?",
new String[] { contact_id }, null);
while (dataCursor.moveToNext()) {
//查询联系人信息
String data1 = dataCursor.getString(0);
//查询联系人信息代码
String mimetype = dataCursor.getString(1);
//3 根据mimetype区分data1列的数据类型
if("vnd.android.cursor.item/name".equals(mimetype)){
contact.setName(data1);//代表名字
}
else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
contact.setPhone(data1);//代表电话
}
else if("vnd.android.cursor.item/email_v2".equals(mimetype)){
contact.setEmail(data1);//代表邮箱
}
/*else if("vnd.android.cursor.item/sip_address".equals(mimetype)){
contact.setAddress(data1);
}*/
}
arrayList.add(contact);
}
return arrayList;
}
3.在MainActivity类中设置点击事件,查询联系人
//点击按钮查询联系人
public void queryContacts(View v){
contacts = ContactsUtils.queryContacts(getApplicationContext());
//循环遍历获得每个联系人
for (Contacts contact:contacts) {
System.out.println("contact"+contact);
}
4.在MainActivity类中设置点击事件,转入插入联系人页面
//点击按钮插入联系人
public void insertContacts(View v){
//创建意图对象
Intent intent = new Intent(this,InsertActivity.class);
//发送意图
startActivity(intent);
}
5.新建InsertActivity类实现联系人插入,配置清单文件
public class InsertActivity extends Activity {
private EditText et_name;
private EditText et_phone;
private EditText et_email;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置加载布局activity_insetr
setContentView(R.layout.activity_insetr);
//1 找到控件
et_name = (EditText) findViewById(R.id.et_name);
et_phone = (EditText) findViewById(R.id.et_phone);
et_email = (EditText) findViewById(R.id.et_email);
}
// 点击按钮 插入一条联系人信息
public void click(View v) {
//获取raw_contacts路径uri
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
//获取raw_contacts路径uri
Uri dataUri = Uri.parse("content://com.android.contacts/data");
//2 获取name phone email Textutils
String name = et_name.getText().toString().trim();
String phone = et_phone.getText().toString().trim();
String email = et_email.getText().toString().trim();
//判断用户输入的信息是否为空,如果为空就不保存
if (!(TextUtils.isEmpty(name) || TextUtils.isEmpty(phone) || TextUtils.isEmpty(email))) {
// 2.1 在插入联系人id的时候 先查询一下 row_contact 一共有几条数据 加+1就是联系人的id
Cursor cursor = getContentResolver().query(uri, null, null, null,null);
int count = cursor.getCount();
int contact_id = count + 1;
//3 先往raw_contacts表 插入联系人的id (contact_id)
ContentValues values = new ContentValues();
values.put("contact_id", contact_id);
getContentResolver().insert(uri, values);
//4 把name插入到data表
ContentValues nameValues = new ContentValues();
nameValues.put("data1", name);
// ☆ ☆ ☆ ☆ ☆ 插入的数据要告诉数据库 属于第几条联系人 和 数据类型
nameValues.put("raw_contact_id", contact_id);
nameValues.put("mimetype", "vnd.android.cursor.item/name");
getContentResolver().insert(dataUri, nameValues);
// 5 把phone号码 插入到data表
ContentValues phoneValues = new ContentValues();
phoneValues.put("data1", phone);
phoneValues.put("mimetype", "vnd.android.cursor.item/phone_v2");
phoneValues.put("raw_contact_id", contact_id);
getContentResolver().insert(dataUri, phoneValues);
// 6 把email号码 插入到data表
ContentValues emailValues = new ContentValues();
emailValues.put("data1", email);
emailValues.put("mimetype", "vnd.android.cursor.item/email_v2");
emailValues.put("raw_contact_id", contact_id);
getContentResolver().insert(dataUri, emailValues);
Toast.makeText(getApplicationContext(), "新联系人保存成功",Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getApplicationContext(), "别闹", Toast.LENGTH_SHORT).show();
}
}
6.在InsertActivity类中设置点击事件,保存成功后点击按钮返回主页面
// 点击按钮返回主页面
public void click1(View v) {
// 创建意图对象
Intent intent = new Intent(this, MainActivity.class);
// 发送意图
startActivity(intent);
}
7.创建MyAdapter继承BaseAdapter,实现内容信息展示到ListView上
//创建一个adapter
public class MyAdapter extends BaseAdapter{
private Context context;
private ArrayList<Contacts> contacts;
//根据构造方法获得要展示的数据
public MyAdapter(Context context,ArrayList<Contacts> contacts){
this.context=context;
this.contacts=contacts;
}
@Override
public int getCount() {
return contacts.size();
}
@Override
public Object getItem(int position) {
return contacts.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=null;
//1 复用conertView
if(convertView!=null){
view=convertView;
}
else {
//resource:要转换成view对象的layout的id
view=View.inflate(context, R.layout.list_item, null);
}
//2 获取view上的子控件对象
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
TextView tv_email = (TextView) view.findViewById(R.id.tv_email);
//3 获取position位置条目对应的集合中的数据
Contacts bean = contacts.get(position);
//4 将数据设置给这些子控件做显示
tv_name.setText(bean.getName());
tv_phone.setText(bean.getPhone());
tv_email.setText(bean.getEmail());
return view;
}
}
8.在MainActivity类中显示ListView
1.找到相应控件
2.创建Adapter对象
因为构造适配器MyAdapter时构造方法中传入了context和contacts,所以创建Adapter对象时要给构造方法传递参数
contacts在点击按钮查询联系人方法中,所以需要在点击按钮方法中创建,并且将调用者的对象this赋值给context
传递给构造方法
3.将Adapter设置到ListView上
public class MainActivity extends Activity {
private Context context;
private ArrayList<Contacts> contacts;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=this;
//1 获取相应控件
lv = (ListView) findViewById(R.id.lv);
}
//点击按钮查询联系人
public void queryContacts(View v){
contacts = ContactsUtils.queryContacts(getApplicationContext());
//循环遍历获得每个联系人
for (Contacts contact:contacts) {
System.out.println("contact"+contact);
}
//2 创建一个adapter
MyAdapter adapter = new MyAdapter(context, contacts);
//3 将adapter设置给listview
lv.setAdapter(adapter);
}
|
|