java - Android 中 Ormlite 查询需要时间

标签 java android bulkinsert ormlite

我正在使用 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(...) 方法。以下是有关该主题的文档:

http://ormlite.com/docs/batch

为了让事情变得更快一点,您还可以在另一个 List 中遍历并记录所有 mFormatedNumber,然后使用 IN< 查询它们 查询。使用原始查询来获取数据库中已有的 mFormatedNumber:

results = dao.queryRaw(
    "SELECT mFormatedNumber from Contact WHERE mFormatedNumber IN ?",
    mFormatedNumberList);

有关使用 ORMLite 的原始查询,请参阅:

http://ormlite.com/docs/raw-queries

因此,您将进行一个查询来查看需要创建哪些联系人,然后在批处理事务中执行所有插入操作。

否则,您将执行大约 3000 个同步数据库事务,并且不幸的是,在 Android 设备上每秒 40 个事务是相当典型的。

关于java - Android 中 Ormlite 查询需要时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172116/

相关文章:

java - 使用匿名类中的图形

java - 将 String 转换为 int

java - 如何在网站中添加嵌入视频的缩略图(Squarespace)

android - 我如何制作静态导航图标?

android - 从另一个应用启动 firefox mobile

android - 验证 rxjava 订阅者中的交互

mysql - 具有唯一约束的批量插入语句

mysql - 如何为 InnoDB 引擎数据库重新播种 "Auto increment"列?

php - mysql INSERT查询中的动态php变量

java - 如何读取数字证书signdata中的原始内容?