Как проверить контакты, присутствующие в приложении? - PullRequest
0 голосов
/ 31 марта 2019

В магазине воспроизведения есть много приложений, в которых отображаются контакты (после получения разрешения от пользователя) и логотип компании в конце каждого пользователя, который указывает, находится ли пользователь в приложении или нет. Этот поток помогает пригласить множество пользователей. Когда я реализовал все вышеперечисленное, все стало действительно сложно, предположим, что в нижней навигационной панели есть специальное действие, скажем Contacts , когда я выбираю контакты из известного метода (запрос Content Resolver), сначала это слишком медленно, поэтому я положил контакты в базу данных sqlite, но это все еще медленно. Как эффективно извлекать контакты? .Like Приложение OYO ROOMS имеет специальное действие Bottom Nav Пригласить и заработать , которое делает именно то, что я хочу. Если кто-нибудь знает, как сделать это эффективно, пожалуйста, дайте мне знать.

private void fetchContactsFromSystem() {
    ContentResolver cr = getContext().getContentResolver();
    Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
    if (cursor != null) {
        try {
            final int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
            final int numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            String name, number;
            while (cursor.moveToNext()) {
                name = cursor.getString(nameIndex);
                number = cursor.getString(numberIndex);
                number = number.replaceAll(" ", "");
                if (!phoneNumberSet.contains(number.trim())) {
                    sqliteDatabaseHelper.insertData(name.trim(), number.trim());
                    Contact contact = new Contact();
                    contact.setName(name);
                    contact.setPhone(number);
                    contact.setInvited(false);
                    contactList.add(contact);
                    phoneNumberSet.add(number);
                }
            }
        } finally {
            cursor.close();
        }
    }
}

массив строк проекции

private static final String[] PROJECTION = new String[]{
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.NUMBER
};

Получение данных из sqlite

    private void setUpFromSqliteDatabase(Cursor cr) {
    String name, number;
    boolean isInvite;
    while (cr.moveToNext()) {
        name = cr.getString(0);
        number = cr.getString(1);
        isInvite = cr.getInt(2) == 1;
        Contact contact = new Contact();
        contact.setName(name);
        contact.setPhone(number);
        contact.setInvited(isInvite);
        contactList.add(contact);
    }
    cr.close();
}

Класс SQLite Helper

public class SqliteDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "contacts.db";
private static final String TABLE_NAME = "contacts";
public static final String NAME = "NAME";
public static final String PHONE_NUMBER = "PHONE_NUMBER";
public static final String IS_INVITED = "IS_INVITED";

public SqliteDatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME +" (NAME TEXT, PHONE_NUMBER TEXT PRIMARY KEY, IS_INVITED INTEGER DEFAULT 0)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
    onCreate(db);
}

public boolean insertData(String name,String phone) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(NAME,name);
    contentValues.put(PHONE_NUMBER,phone);
    long result = db.insert(TABLE_NAME,null ,contentValues);
    db.close();
    return result != -1;
}

public void updateInvitedData(String phoneNumber) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(IS_INVITED, 1);
    db.update(TABLE_NAME, cv, "PHONE_NUMBER = ?",new String[] {phoneNumber});
    db.close();
}

public Cursor getAllData() {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.rawQuery("select * from "+TABLE_NAME,null);
}

}

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

, если ожидаемый результат - набор телефонов, вам не нужно сортировать по DISPLAY_NAME, сортировка обычно дорогая функция в SQLite.

Кроме того, я не буду хранить результаты в локальном SQLite, это вызовет проблемы при попытке сохранить локальную копию и синхронизацию обновленной БД контактов (например, когда пользователь добавляет или удаляет контакт).

0 голосов
/ 31 марта 2019

Есть несколько небольших областей, которые вы могли бы повысить эффективность, купить основную можно было бы получить от пакетирования ваших вкладышей.Вот пример того, как вы можете изменить существующий код для достижения этой цели.

private void fetchContactsFromSystem() {
    final ContentResolver cr = getContext().getContentResolver();
    final String sort = String.format("%s ASC", Phone.DISPLAY_NAME);
    try(Cursor cursor = cr.query(Phone.CONTENT_URI, PROJECTION, null, null, sort)) {
        if(cursor == null || !cursor.moveToFirst()) return;

        final List<Contact> insert = new LinkedList<>();
        final int nameIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
        final int numberIndex = cursor.getColumnIndex(Phone.NUMBER);

        do {
            final String name = cursor.getString(nameIndex);
            final String number = cursor.getString(numberIndex).replaceAll("\\s+","");

            //"true" if number doesn't already exist in the Set
            if(phoneNumberSet.add(number)) {
                //Can make this immutable and pass info in constructor
                final Contact contact = new Contact(name, number, false);
                contactList.add(contact);
                insert.add(contact);  
            }       
        } while(cursor.moveToNext());
        //Conduct bulk insert of "insert" list here
        bulkInsert(insert);
    }

}

private void bulkInsert(List<Contact> contacts) {
    final SQLiteDatabase db = sqliteDatabaseHelper.getWritableDatabase();
    db.beginTransaction();
    try {
        for (Contact contact : contacts) {
            final ContentValues cv = new ContentValues(2);
            cv.put(NAME_ID, contact.name());
            cv.put(NUMBER_ID, contact.number());
            db.insert(TABLE_CONTACTS, null, values);
        }
        db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...