使用Contact数据模型来批量插入联系人(下)

文件5
ContactPersistTask.java文件
package com.teleca.robin.Contact;
import java.util.ArrayList;
import java.util.Random;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
import android.os.AsyncTask;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Im;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.util.Log;
import android.widget.Toast;

import com.teleca.robin.model.EntityDelta;
import com.teleca.robin.model.EntitySet;
import com.teleca.robin.model.EntityDelta.ValuesDelta;

public class ContactPersistTask extends AsyncTask<Integer, Integer, Integer> {
private ProgressDialog mProgress;
Context context;
DialogResolver dialogResolver;
final static String tag="robin";
public ContactPersistTask(DialogResolver dialogResolver) {
this.dialogResolver = dialogResolver;
this.context = (Activity) dialogResolver;
}

/** {@inheritDoc} */

@Override
protected void onPreExecute() {
mProgress = new ProgressDialog((Activity) context);
mProgress.setTitle(R.string.insert_title);
mProgress.setMessage(context.getText(R.string.insert_tip));
mProgress.setProgress(0);
mProgress.setMax(100);
mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialogResolver.showDialog(mProgress);
}

public static EntitySet generateRawContactSet (int count) {
EntityDelta rawContact = generateRawContact();
EntitySet entitySet = EntitySet.fromSingle(rawContact);
for (int i = 1; i < count; i++) {
entitySet.add(generateRawContact());
}
return entitySet;
}

public static EntityDelta generateRawContact () {
String accountType = null;
String accountName = null;
ContentValues contentValues = new ContentValues();
contentValues.put(RawContacts.ACCOUNT_TYPE, accountType);
contentValues.put(RawContacts.ACCOUNT_NAME, accountName);
ValuesDelta values = ValuesDelta.fromAfter(contentValues);
EntityDelta rawContact = new EntityDelta(values);
// name
ContentValues nameValues = new ContentValues();
nameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
nameValues.put(StructuredName.FAMILY_NAME, generateFamilyName());
nameValues.put(StructuredName.GIVEN_NAME, generateGivenName());
rawContact.addEntry(ValuesDelta.fromAfter(nameValues));
// phone number
ContentValues phoneValues = new ContentValues();
phoneValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
phoneValues.put(Phone.NUMBER, generateMobilePhone());
phoneValues.put(Phone.TYPE, Phone.TYPE_CUSTOM);
rawContact.addEntry(ValuesDelta.fromAfter(phoneValues));
phoneValues = new ContentValues();
phoneValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
phoneValues.put(Phone.NUMBER, generateHomePhone());
phoneValues.put(Phone.TYPE, Phone.TYPE_HOME);
rawContact.addEntry(ValuesDelta.fromAfter(phoneValues));
// email
ContentValues emailValues = new ContentValues();
emailValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
emailValues.put(Email.ADDRESS, generateEmail());
emailValues.put(Email.TYPE, Email.TYPE_HOME);
rawContact.addEntry(ValuesDelta.fromAfter(emailValues));
emailValues = new ContentValues();
emailValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
emailValues.put(Email.ADDRESS, generateEmail());
emailValues.put(Email.TYPE, Email.TYPE_MOBILE);
rawContact.addEntry(ValuesDelta.fromAfter(emailValues));
// group
/*
* ContentValues groupValues=new ContentValues();
* groupValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
* groupValues.put(GroupMembership.GROUP_ROW_ID, "0");
*/
// IM
ContentValues imValues = new ContentValues();
imValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
imValues.put(Im.DATA, generateQQ());
imValues.put(Im.TYPE, Im.TYPE_CUSTOM);
imValues.put(Im.PROTOCOL, Im.PROTOCOL_QQ);
rawContact.addEntry(ValuesDelta.fromAfter(imValues));
imValues = new ContentValues();
imValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
imValues.put(Im.DATA, generateMSN());
imValues.put(Im.TYPE, Im.TYPE_WORK);
imValues.put(Im.PROTOCOL, Im.PROTOCOL_MSN);
rawContact.addEntry(ValuesDelta.fromAfter(imValues));
// Postal address
/*
* ContentValues postalAddressValues=new ContentValues();
* postalAddressValues.put(Data.MIMETYPE,
* StructuredPostal.CONTENT_ITEM_TYPE);
* postalAddressValues.put(StructuredPostal
* .TYPE,StructuredPostal.TYPE_HOME);
*/
return rawContact;
}

final static String familyNames [] = { "hu", "yang", "wang", "li", "zhang",
"long", "zhu", "zheng", "tao", "liu", "wen", "zhao", "zu", "xu",
"zhou", "ling", "nu", "luo", "wuang", "liao", "yuan", "sun", "he",
"guo", "nuo", "bai" };
final static Random random = new Random(System.currentTimeMillis());

public static String generateFamilyName () {
int len = familyNames.length;
int index = random.nextInt() % len;
index = (index + len) % len;
return familyNames[index];
}

final static String giveNames [] = { "bing", "wei", "qiang", "chao", "qing",
"yang", "xing chi", "bin", "qi chao", "guo wei" ,"xi","tao","guo rong"};

public static String generateGivenName () {
int len = giveNames.length;
int index = random.nextInt() % len;
index = (index + len) % len;
int number = random.nextInt() % 100;
if (number < 0)
return giveNames[index];
else
return giveNames[index] + number;
}

public static String generateMSN () {
int number = random.nextInt() % 100;
if (number < 0) {
return "hubinforever@163.com";
} else {
return "hubinforever" + number + "@163.com";
}
}

public static String generateQQ () {
int number = random.nextInt() % 1000;
if (number < 0) {
return "248600690";
} else {
return "248600" + number;
}
}

final static String kEmailPrefix[] = { "hh", "hubing", "abc" };
final static String kEmailSuffix[] = { "@163.com", "@qq.com", "@sohu.com",
"@google.com" };

public static String generateEmail () {
int prefixIndex = random.nextInt() % kEmailPrefix.length;
if (prefixIndex < 0) {
prefixIndex = 0;
}
int suffixIndex = random.nextInt() % kEmailSuffix.length;
if (suffixIndex < 0)
suffixIndex = 0;
int number = random.nextInt() % 1000;
if (number < 0) {
return kEmailPrefix[prefixIndex] + kEmailSuffix[suffixIndex];
} else {
return kEmailPrefix[prefixIndex] + number
+ kEmailSuffix[suffixIndex];
}
}

final static StringBuffer strBuffer = new StringBuffer();

public static String generateHomePhone () {
strBuffer.delete(0, strBuffer.length());
strBuffer.append("028");
for (int i = 0; i < 8; i++) {
int number = random.nextInt() % 10;
if (number < 0)
number = 8;
strBuffer.append(number);
}
return strBuffer.toString();
}

final static String kMobilePrefix[] = { "135", "138", "139", "189", "130" };

public static String generateMobilePhone () {
strBuffer.delete(0, strBuffer.length());
int number = random.nextInt() % kMobilePrefix.length;
if (number < 0)
number = 0;
strBuffer.append(kMobilePrefix[number]);
for (int i = 0; i < 8; i++) {
number = random.nextInt() % 10;
if (number < 0)
number = 8;
strBuffer.append(number);
}
return strBuffer.toString();
}

final static int kInsertOnceLimit = 10;

/** {@inheritDoc} */
@Override
protected Integer doInBackground (Integer... count) {
final ContentResolver resolver = context.getContentResolver();
int complement = count[0] % kInsertOnceLimit;
EntitySet rawContactSet = null;
int size = 0;
for (int i = count[0]; i > 0; i = i - kInsertOnceLimit) {
if (i >= kInsertOnceLimit) {
rawContactSet = generateRawContactSet(kInsertOnceLimit);
} else
rawContactSet = generateRawContactSet(complement);
rawContactSet.splitRawContacts();
publishProgress((kInsertOnceLimit*100/count[0])/4);

// Build operations and try applying
final ArrayList<ContentProviderOperation> diff = rawContactSet
.buildDiff();
ContentProviderResult[] results = null;
if (!diff.isEmpty()) {

try {
results = resolver.applyBatch(ContactsContract.AUTHORITY,
diff);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OperationApplicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
publishProgress((kInsertOnceLimit*100/count[0])/2);
boolean res = refreshRawContactId(rawContactSet, diff, results);
publishProgress((kInsertOnceLimit*100/count[0])/4);
size = size + rawContactSet.size();
Log.i(tag, "size:"+size);
}
return size;
}
protected void onProgressUpdate (Integer... progress) {
mProgress.incrementProgressBy(progress[0]);
}
final static ArrayList<Long> rawContactIdList = new ArrayList<Long>(
kInsertOnceLimit);

private boolean refreshRawContactId (EntitySet entitySet,
final ArrayList<ContentProviderOperation> diff,
final ContentProviderResult[] results) {
rawContactIdList.clear();
long rawContactId;
final int diffSize = diff.size();
for (int i = 0; i < diffSize; i++) {

ContentProviderOperation operation = diff.get(i);

if (operation.getType() == ContentProviderOperation.TYPE_INSERT

&& operation.getUri().getEncodedPath().contains(

RawContacts.CONTENT_URI.getEncodedPath())) {

rawContactId = ContentUris.parseId(results[i].uri);
rawContactIdList.add(rawContactId);

}

}
int size = entitySet.size();
EntityDelta entityDelta = null;
int k = 0;
for (int i = 0; i < size; i++) {
entityDelta = entitySet.get(i);
if (entityDelta.isContactInsert())
k++;
}
if (k != rawContactIdList.size())
{
Log.i(tag, "refresh rawContactId fail!");
return false;
}
for (int i = 0; i < size; i++) {
if (entityDelta.isContactInsert())
{
entityDelta = entitySet.get(i);
rawContactId=rawContactIdList.get(i);
entityDelta.getValues().put(RawContacts._ID,rawContactId);
}
}
return true;

}

@Override
protected void onPostExecute (Integer result) {
Toast.makeText(context, "insert " + result + " Contacts success!",
Toast.LENGTH_SHORT).show();
dialogResolver.dismissDialog(mProgress);

}

}
<wbr style="line-height:25px"></wbr>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值