只向android添加联系人姓名和号码,并在运行时显示在textview中

只向android添加联系人姓名和号码,并在运行时显示在textview中,android,android-intent,nullpointerexception,android-contentprovider,Android,Android Intent,Nullpointerexception,Android Contentprovider,我正在尝试在android中插入联系人姓名和号码,并尝试在编辑视图中查看相同的联系人。。 我想给你看看代码 更新内容[我自己]: 通过以下链接获得答案; 代码: import java.util.ArrayList; 导入android.app.Activity; 导入android.content.ContentProviderOperation; 导入android.content.ContentValues; 导入android.content.OperationApplicationE

我正在尝试在android中插入联系人姓名和号码,并尝试在编辑视图中查看相同的联系人。。 我想给你看看代码

更新内容[我自己]: 通过以下链接获得答案;

代码:

import java.util.ArrayList;
导入android.app.Activity;
导入android.content.ContentProviderOperation;
导入android.content.ContentValues;
导入android.content.OperationApplicationException;
导入android.database.Cursor;
导入android.net.Uri;
导入android.os.Bundle;
导入android.os.RemoteException;
导入android.provider.contacts合同;
导入android.view.view;
导入android.widget.EditText;
导入android.widget.TextView;
导入android.widget.Toast;
公共类ContentProviderContactsDemo扩展活动
{
ContentValues=新的ContentValues();
//用于查看现有联系人姓名和号码
文本视图名称、编号;
//要在“添加”按钮上输入新联系人姓名和号码,请单击
编辑文本newname,newnumber;
//形成一个数组,指定要返回的列。
字符串[]投影=新字符串[]{
Contacts contract.Contacts.DISPLAY\u NAME,
Contacts contract.CommonDataTypes.Phone.NUMBER
};
//获取联系人内容提供程序中人员/联系人表的基本URI。
Uri contacts=contacts contract.commondatatypes.Phone.CONTENT\u Uri;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.contacts\u显示);
name=(TextView)findViewById(R.id.name);
number=(TextView)findViewById(R.id.number);
newname=(EditText)findViewById(R.id.newname);
newnumber=(EditText)findViewById(R.id.newnumber);
makeQuery();
}
私有void makeQuery()
{
//进行查询。
游标managedCursor=getContentResolver().query(联系人,
投影,//返回哪些列
null,//返回哪些行(所有行)
null,//选择参数(无)
null//按名称升序排列结果
);
name.append(“\n”+“name\n”);
号码。附加(“\n”+”电话号码\n”);
//在文本视图中显示记录
getColumnData(managedCursor);
}
私有void getColumnData(游标cur)
{ 
字符串名称\u disp;
字符串phoneNumber_disp;
//将光标移动到第一个记录或行数据
cur.moveToFirst();
int nameColumn=cur.getColumnIndex(ContactsContract.Contacts.DISPLAY\u NAME);
int phoneColumn=cur.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER);
做
{
//获取字段值并在文本视图中显示
//取名字
name_disp=cur.getString(nameColumn);
//在TextView中插入它
名称。追加(“\n”+名称显示);
//获取电话号码
phoneNumber_disp=cur.getString(phoneColumn);
//在TextView中插入它
编号。追加(“\n”+电话号码\u disp);
}while(cur.moveToNext());
}
public void insertData(视图v)引发RemoteException、OperationApplicationException
{
字符串addname;
字符串addnumber;
addname=newname.getText().toString();
addnumber=newnumber.getText().toString();
////插入新联系人姓名和号码的一种方法错误!!!
//将记录添加到联系人并使其成为最喜爱的联系人。
//value.put(ContactsContract.CommonDataTypes.StructuredName.DISPLAY\u NAME,addname);
//value.put(Phone.NUMBER,addnumber);
//Uri Uri=getContentResolver().insert(ContactsContract.Data.CONTENT\u Uri,值);
//返回所添加记录的完整URI,即ID
////插入联系人姓名的其他方法
ArrayList ops=新的ArrayList();
if(addname!=null)
{
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带ValueBackReference(contacts contract.Data.RAW\u CONTACT\u ID,0)
.withValue(ContactsContact.Data.MIMETYPE、ContactsContact.CommonDataTypes.StructuredName.CONTENT\u ITEM\u TYPE)
.withValue(ContactsContract.CommonDataTypes.StructuredName.DISPLAY\u NAME,addname)
.build());
}
if(addnumber!=null)
{
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带ValueBackReference(contacts contract.Data.RAW\u CONTACT\u ID,0)
.withValue(contacts contract.Data.MIMETYPE、contacts contract.commondatatypes.Phone.CONTENT\u ITEM\u TYPE)
.withValue(contacts contract.commonDataTypes.Phone.NUMBER,addnumber)
.withValue(ContactsContact.CommonDataTypes.Phone.TYPE,ContactsContact.CommonDataTypes.Phone.TYPE\u MOBILE)
.build());
}
尝试
{
getContentResolver().applyBatch(contacts contract.AUTHORITY,ops);
} 
捕获(例外e)
{
e、 printStackTrace();
Toast.makeText(这个,“异常:+e.getMessage(),Toast.LENGTH_SHORT).show();
}
//清除联系人显示列表并显示更新的联系人姓名和号码
name.setText(“”);
编号:setText(“”);
makeQuery();
}
}
我添加了注释,以使您理解代码。 我想要的是列出新插入的记录的联系人。。 我也不确定我的代码是否在contact中插入新记录,因为我无法查看它

显示布局文件的屏幕截图

正如您在布局中看到的,上面显示的联系人已经在android中添加了联系人。但是当我添加新联系人时,我无法看到更新的视图

请任何人都能在这方面帮助我。。 我不确定,但我认为当我按下“添加”按钮时,联系人实际上没有得到“添加”。因此,它没有更新或显示在上面的文本视图中。。 我在stack overflow和其他网站上的每一个地方都引用了大部分文章。但是
import java.util.ArrayList;
import android.app.Activity;
import android.content.ContentProviderOperation;
import android.content.ContentValues;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class ContentProviderContactsDemo extends Activity
{

ContentValues values = new ContentValues(); 

// for viewing existing contact name and number
TextView name, number;

// for entering new contact name and number on add button click
EditText newname, newnumber;

// Form an array specifying which columns to return. 
String[] projection = new String[] {
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.NUMBER 
};

// Get the base URI for the People/Contacts table in the Contacts content provider.
Uri contacts = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contacts_display);

    name = (TextView) findViewById(R.id.name);
    number = (TextView) findViewById(R.id.number);

    newname = (EditText) findViewById(R.id.newname);
    newnumber = (EditText) findViewById(R.id.newnumber);

    makeQuery();
}

private void makeQuery()
{
    // Make the query. 
    Cursor managedCursor = getContentResolver().query(contacts,
            projection,       // Which columns to return 
            null,            // Which rows to return (all rows)
            null,           // Selection arguments (none)
            null           // Put the results in ascending order by name
            );

    name.append("\n" + "NAME \n");
    number.append("\n" + "PHONE NUMBERS \n");

    // display records in TextView
    getColumnData(managedCursor);
}

private void getColumnData(Cursor cur)
{ 
    String name_disp; 
    String phoneNumber_disp; 

    //moving the cursor to the first record or row data
    cur.moveToFirst();
    int nameColumn = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
    int phoneColumn = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
    do
    {
        // Get the field values and display it in a TextView
        //get Names
        name_disp = cur.getString(nameColumn);
        //insert it in TextView
        name.append("\n" + name_disp);
        //get phone number
        phoneNumber_disp = cur.getString(phoneColumn);
        //insert it in TextView
        number.append("\n" + phoneNumber_disp);
    } while (cur.moveToNext());
}

public void insertData(View v) throws RemoteException, OperationApplicationException
{
    String addname;
    String addnumber;

    addname = newname.getText().toString();
    addnumber = newnumber.getText().toString();

    //// one way to insert the new contact name and number ERROR !!!

    // Add Records to contacts and make him a favorite.
    //values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, addname);
    //values.put(Phone.NUMBER, addnumber);

    //Uri uri = getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
    // returns the full URI for the added record, meaning with the ID


    //// other way to insert the contact name
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

    if (addname != null) 
    {
        ops.add(ContentProviderOperation.newInsert( ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,addname)
                .build());
    }

    if (addnumber != null) 
    {
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, addnumber)
                .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
                .build());
    }

    try 
    {
        getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
        Toast.makeText(this, "Exception: " + e.getMessage(), Toast.LENGTH_SHORT).show();
    }

    // clearing list of contact display and displaying with updated contact name and number

    name.setText("");
    number.setText("");

    makeQuery();
}
}
    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
            .withValue(RawContacts.ACCOUNT_TYPE, null)
            .withValue(RawContacts.ACCOUNT_NAME, null).build());
    ops.add(ContentProviderOperation
            .newInsert(Data.CONTENT_URI)
            .withValueBackReference(Data.RAW_CONTACT_ID,
                    rawContactInsertIndex)
            .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
            .withValue(StructuredName.DISPLAY_NAME, name).build());
    ops.add(ContentProviderOperation
            .newInsert(Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,
                    rawContactInsertIndex)
            .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
            .withValue(Phone.NUMBER, fax)
            .withValue(Phone.TYPE, Phone.TYPE_FAX_WORK).build());
    ops.add(ContentProviderOperation
            .newInsert(Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,
                    rawContactInsertIndex)
            .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
            .withValue(Phone.NUMBER, phone)
            .withValue(Phone.TYPE, Phone.TYPE_MOBILE).build());
    ops.add(ContentProviderOperation
            .newInsert(Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Email.DATA, email)
            .withValue(Email.TYPE, Email.TYPE_WORK).build());

    try {
        ContentProviderResult[] res = getContentResolver().applyBatch(
                ContactsContract.AUTHORITY, ops);
        System.out.println("" + res);
    } catch (RemoteException e) {
        e.printStackTrace();
    } catch (OperationApplicationException e) {
        e.printStackTrace();
    }
}