zoukankan      html  css  js  c++  java
  • Android 四大组件学习之ContentProvider四

    上节我们学习了怎样去读取系统短信以及插入一条短信到系统中。 本节我们学习怎样获取系统的联系人,以及插入一条联系人

    好。废话不多说了,直接操作。

    首先和读取短信一样,先找到联系人在数据库中的位置。

    然后导出,查看数据库中的内容

    上图就是怎样到数据库中找打系统的联系人数据,(看起来图画的有点乱,希望能看懂吧)

    既然知道怎样能到系统的数据库找到数据。那我们就開始写代码实现吧:

    public class ReadContactActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    	    setContentView(R.layout.activity_readcontact);
    	    
    	    
    	}
    	
    	
    	public void readContact(View v)
    	{
    		ContentResolver cr = getContentResolver();
    		
    		/*
    		 * 先到raw_contacts表中拿到contact_id
    		 * content://com.android.contacts/raw_contacts是raw_contacts的訪问url
    		 * */
    		Cursor contactId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
    		while(contactId.moveToNext())
    		{
    			/*
    			 * 拿到contact_id接着到data表中去依据raw_contact_id获取mimetype_id和data1数据
    			 * */
    			String id = contactId.getString(contactId.getColumnIndex("contact_id"));
    			
    			/**
    			 * "content://com.android.contacts/data"是訪问data表的url
    			 * 通过id也就是contact_id去data表中找,data1, raw_contact_id, mimetype_id.
    			 * 可是, id就是raw_contact_id,所以就不用再找了。

    而mimetype_id因为Android系统为我们自己优化了一些细节。当你在data表中找mimetype_id是找不到的 * android系统直接将mimetype_id转变为找mimetype了 */ Cursor contactData = cr.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1", "mimetype"}, "raw_contact_id = ?", new String[]{id}, null); String email = null, phone = null, name = null; while(contactData.moveToNext()) { String data1 = contactData.getString(contactData.getColumnIndex("data1")); String mimetype = contactData.getString(contactData.getColumnIndex("mimetype")); /*假设mimetype是邮箱*/ if("vnd.android.cursor.item/email_v2".equals(mimetype)) { email = data1; }//假设mimetype是电话 else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) { phone = data1; }//假设mimetype是名字 else if ("vnd.android.cursor.item/name".equals(mimetype)){ name = data1; } } Log.i("ReadContactActivity", id + ';' + name + ";" + phone + ";" + email); } } }


    打印结果为:

    上图就是怎样获取联系人的操作。

    注意: 读取联系人,短信等信息都须要加上权限的:


    既然知道怎样从系统中获取联系人。那就应该会为系统插入一条联系人的记录。

    接下来我们实现为系统插入一条联系人记录

    Activity的插入的代码:

    public void insertContact(View v)
    	{
    		ContentResolver cr = getContentResolver();
    		Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"_id"}, null, null, null);
    		/*假设数据库中没有数据,则插入的就是第一条数据*/
    		int contactId = 1;
    		if(cursor.moveToLast())
    		{
    			/*假设有数据,就插入到最新的写一条*/
    			int id = cursor.getInt(cursor.getColumnIndex("_id"));
    			contactId = id + 1;
    		}
    		
    		ContentValues values = new ContentValues();
    		/*将新的id插入到raw_contacts表中*/
    		values.put("contact_id", contactId);
    		cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"), values);
    		
    		/*插入名字*/
    		values.clear();
    		values.put("data1", "erlangsheng");
    		values.put("mimetype", "vnd.android.cursor.item/name");
    		values.put("raw_contact_id", contactId);
    		cr.insert(Uri.parse("content://com.android.contacts/data"), values);
    		
    		/*插入电话*/
    		values.clear();
    		values.put("data1", "00189890");
    		values.put("mimetype", "vnd.android.cursor.item/phone_v2");
    		values.put("raw_contact_id", contactId);
    		cr.insert(Uri.parse("content://com.android.contacts/data"), values);	
    		
    	}
    }

    结果为:




    以上就是给联系人插入一条记录。







  • 相关阅读:
    [转]使用NLog记录日志到数据库 自定义日志表的数据格式
    [转]使用C#实现长整型向任意编码的转换和逆转换
    解释一下 P/NP/NPComplete/NPHard 等问题
    在C#中创建进度窗体
    [转载] 关于Winform编译中的属性设置
    [转]使用NLog記錄Exception
    SQL Server数据库,在表上建立唯一性索引的一些问题
    DES文件字符加密解密
    线程运行超时处理类
    使用FFmpeg从视频中截图的命令
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6785886.html
Copyright © 2011-2022 走看看