Android Contact游标需要花费太多时间来迭代

时间:2013-03-28 13:46:50

标签: android sqlite cursor android-contacts android-cursor

我想从Phone Contact应用程序中获取所有联系人并插入本地sqlite数据库。 但问题是android联系人游标需要时间来迭代...

CODE:

private Cursor getContacts() {
        // Run query
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = new String[] { ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME };
        String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '"
                + ("1") + "'";
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
                + " COLLATE LOCALIZED ASC";
        return managedQuery(uri, projection, selection, selectionArgs,
                sortOrder);
    }

INSERT INTO DB:

long mStartTime = System.currentTimeMillis();

        int batch = 50;

        try {

            SQLiteDatabase db = this.getWritableDatabase();

            // InsertHelper insertHelper = new InsertHelper(db,
            // TABLE_USER_INFO);
            // String insertSql =
            // "INSERT INTO UserInfo (firstname,lastname,userid,serveruserid,phonenumber,emailaddress,street,state,city,country) VALUES (?,?,?,?,?,?,?,?,?,?) ";
            // SQLiteStatement sqLiteStatement = db.compileStatement(insertSql);

            if (cursor != null) {
                if (cursor.moveToFirst()) {

                    for (int i = 0; i < cursor.getCount() / batch
                            + (((cursor.getCount() % batch) > 0) ? 1 : 0); i++) {
                        mStartTime = System.currentTimeMillis();
                        StringBuilder sqlBuilder = new StringBuilder();
                        db.beginTransaction();

                        sqlBuilder
                                .append("INSERT INTO UserInfo (firstname,lastname,userid,serveruserid,phonenumber,emailaddress,street,state,city,country) ");

                        for (int j = 0; j < batch; j++) {

                            String name = cursor
                                    .getString(cursor
                                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                            long _id = cursor
                                    .getLong(cursor
                                            .getColumnIndex(ContactsContract.Contacts._ID));

                            // ADDRESS
                            Cursor address = context
                                    .getContentResolver()
                                    .query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
                                            null,
                                            ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID
                                                    + " = " + _id, null, null);
                            String street = null, city = null, state = null, country = null;
                            while (address.moveToNext()) {
                                street = address
                                        .getString(address
                                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
                                city = address
                                        .getString(address
                                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
                                state = address
                                        .getString(address
                                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
                                country = address
                                        .getString(address
                                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));

                            } // address.moveToNext()
                            address.close();

                            // PHONE NO
                            String phoneNumber = null;
                            Cursor phones = context
                                    .getContentResolver()
                                    .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                            null,
                                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                                    + " = " + _id, null, null);
                            while (phones.moveToNext()) {
                                phoneNumber = phones
                                        .getString(phones
                                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            }
                            phones.close();

                            // EMAIL ID
                            String emailId = null;
                            Cursor emails = context
                                    .getContentResolver()
                                    .query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                            null,
                                            ContactsContract.CommonDataKinds.Email.CONTACT_ID
                                                    + " = " + _id, null, null);
                            while (emails.moveToNext()) {
                                emailId = emails
                                        .getString(emails
                                                .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                            }
                            emails.close();

                            // INSERT INTO DB
                            ContentValues values = new ContentValues();

                            String[] names = name.split(" ");
                            if (name != null && names.length == 1) {
                                values.put(KEY_FIRST_NAME, name);
                                values.put(KEY_LAST_NAME, "");
                            } else if (name != null && names.length > 1) {
                                values.put(KEY_FIRST_NAME, names[0]);
                                values.put(KEY_LAST_NAME, names[1]);
                            }

                            // Log.d(TAG, "User Id:" + _id);

                            values.put(KEY_USER_LOCAL_ID, _id);
                            values.put(KEY_SERVER_USER_ID, "0");

                            if (phoneNumber != null
                                    && !phoneNumber.equalsIgnoreCase("0")) {
                                // REPLACE "-" FROM PHONE NO
                                phoneNumber = phoneNumber.replace("-", "")
                                        .trim();
                                values.put(KEY_PH_NO, IOUtils
                                        .getFormatedPhoneNo(context,
                                                phoneNumber));
                                Log.e(TAG, "Inserting contacts into db name:"
                                        + name + " Phone:" + phoneNumber);
                            }

                            if (emailId != null)
                                values.put(KEY_EMIAL, emailId);

                            if (street != null)
                                values.put(KEY_STREET, street);
                            if (state != null)
                                values.put(KEY_STATE, state);
                            if (city != null)
                                values.put(KEY_CITY, city);
                            if (country != null)
                                values.put(KEY_COUNTRY, country);

                            if (emailId == null && phoneNumber == null) {
                                // Log.d(TAG, "email,ph no not found:" + name);
                            } else {

                                Log.e(TAG, "*** Name:" + name + " Email id:"
                                        + emailId + " phone:" + phoneNumber);

                                if (j == 0)
                                    sqlBuilder.append(" SELECT ");
                                else
                                    sqlBuilder.append(" UNION SELECT ");

                                sqlBuilder
                                        .append("'"
                                                + values.getAsString(
                                                        KEY_FIRST_NAME)
                                                        .replace("'", "") + "'")
                                        .append(" AS " + KEY_FIRST_NAME + ", ");
                                sqlBuilder.append(
                                        "'"
                                                + values.getAsString(
                                                        KEY_LAST_NAME).replace(
                                                        "'", "") + "'").append(
                                        " AS " + KEY_LAST_NAME + ", ");
                                sqlBuilder
                                        .append("'"
                                                + values.getAsString(KEY_USER_LOCAL_ID)
                                                + "'")
                                        .append(" AS " + KEY_USER_LOCAL_ID
                                                + ", ")

                                        //
                                        .append("'")
                                        .append((values
                                                .getAsString(KEY_SERVER_USER_ID) != null) ? values
                                                .getAsString(KEY_SERVER_USER_ID)
                                                : " ")
                                        .append("'")
                                        .append(" AS " + KEY_SERVER_USER_ID
                                                + ", ")

                                        //
                                        .append("'")
                                        .append((values.getAsString(KEY_PH_NO) != null) ? values
                                                .getAsString(KEY_PH_NO) : "")
                                        .append("'")
                                        .append(" AS " + KEY_PH_NO + ", ")

                                        //
                                        .append("'")
                                        .append((values.getAsString(KEY_EMIAL) != null) ? values
                                                .getAsString(KEY_EMIAL) : "")
                                        .append("'")
                                        .append(" AS " + KEY_EMIAL + ", ")

                                        //
                                        .append("'")
                                        .append((values.getAsString(KEY_STREET) != null) ? values
                                                .getAsString(KEY_STREET) : "")
                                        .append("'")
                                        .append(" AS " + KEY_STREET + ", ")

                                        //
                                        .append("'")
                                        .append((values.getAsString(KEY_STATE) != null) ? values
                                                .getAsString(KEY_STATE) : "")
                                        .append("'")
                                        .append(" AS " + KEY_STATE + ", ")
                                        //
                                        .append("'")
                                        .append((values.getAsString(KEY_CITY) != null) ? values
                                                .getAsString(KEY_CITY) : "")
                                        .append("'")
                                        .append(" AS " + KEY_CITY + ", ")

                                        //
                                        .append("'")
                                        .append((values
                                                .getAsString(KEY_COUNTRY) != null) ? values
                                                .getAsString(KEY_COUNTRY) : "")
                                        .append("'")
                                        .append(" AS " + KEY_COUNTRY);
                            }
                            if (!cursor.moveToNext()) {
                                Log.d(TAG, "Cursor pos" + cursor.getPosition());
                                break;

                            }
                        }

                        // Log.d(TAG, "BUILDER: " + sqlBuilder.toString());
                        db.execSQL(sqlBuilder.toString());
                        db.setTransactionSuccessful();
                        db.endTransaction();
                        Log.e("Time:",
                                "operatio time"
                                        + (mStartTime - System
                                                .currentTimeMillis()));
                    }
                }
            }

            // CLOSE DB

            db.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // insertHelper.c
        }

花了4分钟插入......

请建议迭代光标的有效方法。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

使用managedQuery(...),您可以投射查询投影(以要提取的列数组的形式)并提取更大的数据。通过这样做,您可以缓解单独查询数据库的问题。这就是整个过程中最高的。

另外,支持包v4中存在新的CursorLoader类,以异步方式加载该数据。

此外,您可以使用moveToNext()迭代while循环,因为游标始终在数据之前“开始”。