我正在使用 Ormlite 的 Android 应用程序中工作。我正在获取我的电话簿联系人并将它们保存在本地数据库中,但问题是它花费了太多时间,例如对于近 1500 个联系人,它花费了近 70 秒。
我在ormlite中搜索了Bulk insert,但我不知道如何在下面的代码中实现它。
public static void loadLocalPhoneBookSample(Context ctx) {
try{
ContentResolver contentRes = ctx.getContentResolver();
Cursor cur = null;
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER;
cur = contentRes.query(ContactsContract.Contacts.CONTENT_URI, PROJECTIONS, selection, null, Phone.DISPLAY_NAME + " ASC");
context = ctx;
if (cur.getCount() > 0) {
// create DB object
MUrgencyDBHelper db = new MUrgencyDBHelper(ctx);
RuntimeExceptionDao<ContactLocal, ?> contactDAO = db.getContactLocalIntDataDao();
UpdateBuilder<ContactLocal, ?> updateDAO = contactDAO.updateBuilder();
try {
updateDAO.updateColumnValue("isUseless", true);
updateDAO.update();
} catch (SQLException e) {
e.printStackTrace();
}finally {
// db.writeUnlock();
}
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
/** read names **/
String displayName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
/** Phone Numbers **/
Cursor pCur = contentRes.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?", new String[] { id }, null);
while (pCur.moveToNext()) {
String number = pCur
.getString(pCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String formatedNo = number.replaceAll("\\s+", "").replace("+", "00").replace("-", "").trim();
try {
QueryBuilder<ContactLocal, ?> query = contactDAO.queryBuilder();
query.where().eq("mFormatedNumber", number);
ContactLocal contact = query.queryForFirst();
boolean addContact = false, alreadyUpdated = true;
if (contact == null) {
addContact = true;
contact = new ContactLocal();
contact.setFirstName(displayName.trim());
contact.setLastName(displayName.trim());
contact.setContactNumber(formatedNo);
}
// check if this contact was already updated before
if (contact.getContactNumber() == null || contact.getContactNumber().length() == 0) {
contact.setContFirstLastNo(number, displayName, displayName, number);
alreadyUpdated = false;
}
contact.setUseless(false);
// if not updated already, Create/Update
if (addContact) {
contactDAO.create(contact);
} else
contactDAO.update(contact);
}
}
pCur.close();
}
}
}
最佳答案
the problem is that it is taking too much time like for almost 1500 contact it is taking almost 70 seconds
@CarloB 在 dao 内进行质量创建方面有正确的答案。 callBatchTasks(...)
方法。以下是有关该主题的文档:
为了让事情变得更快一点,您还可以在另一个 List
中遍历并记录所有 mFormatedNumber
,然后使用 IN< 查询它们
查询。使用原始查询来获取数据库中已有的 mFormatedNumber
:
results = dao.queryRaw(
"SELECT mFormatedNumber from Contact WHERE mFormatedNumber IN ?",
mFormatedNumberList);
有关使用 ORMLite 的原始查询,请参阅:
因此,您将进行一个查询来查看需要创建哪些联系人,然后在批处理事务中执行所有插入操作。
否则,您将执行大约 3000 个同步数据库事务,并且不幸的是,在 Android 设备上每秒 40 个事务是相当典型的。
关于java - Android 中 Ormlite 查询需要时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172116/