Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
1

Контакты с гугл аккаунта

06.02.2013, 16:55. Просмотров 1395. Ответов 17
Метки нет (Все метки)

Используя контент провайдер получаю список контактов у которых есть дни рождения. Этот список вывожу в виджет. Получаю 5, 10 строк не больше. На телефонах, где телефонная книжка большая, примерно 150-200 контактов программа подвисает или вообще вылетает с ошибкой. Проверить не могу, что бы отследить ошибку на моих телефонах все работает. Может на вскидку кто может указать вектор проблемы? От версии дроида не зависит и от можности телефона тоже, точно выявлено, что зависит от количества контактов.

Вот код получения списка:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private static void getDataFromContacts(Context context){
    ContentResolver contentResolver = context.getContentResolver();
    
    Uri uri = ContactsContract.Data.CONTENT_URI;
    String[] projection = new String[] {
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Event.CONTACT_ID,
        ContactsContract.CommonDataKinds.Event.START_DATE
    };
    String startdate = ContactsContract.CommonDataKinds.Event.START_DATE;
    String selection =
        ContactsContract.Data.MIMETYPE + "= ? AND " +
        ContactsContract.CommonDataKinds.Event.TYPE + "=" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;
    String[] selectionArgs = new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE};
    String sortOrder = String.format("(substr("+startdate+",6,2)  * 100+substr("+startdate+",9,2))+CASE WHEN (substr("+startdate+",6,2)  * 100+substr("+startdate+",9,2))>=(2*100+6) THEN 1 ELSE 2000 END LIMIT 5");
    
    final Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder); 
    
    while (cursor.moveToNext()) {
        String date = cursor.getString(2);
        String[] strdate = date.split("-");
        int ND = Integer.valueOf(strdate[2]);
        int NM = Integer.valueOf(strdate[1]);
        String comm = cursor.getString(0);
        setDataTmp(context, comm, ND, NM, false);//запись в базу данных SQLite
    }
    cursor.close();
}
вообще у меня сначала записываются данные в общую базу из разных источников. источников три. первые два имеют по 200-300 строк и отрабатываются на ура. Недавно добавил считывание контактов и вот такая засада.
В SortOrder идет сортировка данных упорядочивая даты которые больше 6 февраля (для примера) и результат ограничивается 5-ю строками. Промежуточную базу использую для сортировки данных из разных источников.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 16:55
Ответы с готовыми решениями:

2 гугл аккаунта на один admob
Не заблокирует ли гугл за подобное? аккаунты не заблокированные, одна...

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

Регистрация аккаунта разработчика
Здравствуйте! Обращаюсь ко всем кто регистрировал аккаунт разработчика. ...

Разметка (фон аккаунта)
Как сделать черный прямоугольник на фона аккаунта как на скрине со "Стивом...

Регистрация аккаунта разработчика
Товарищи! Такой вопрос. Регистрирую аккаунт разработчика. Заполняю необходимые...

17
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 18:48 2
Цитата Сообщение от dubok79 Посмотреть сообщение
вылетает с ошибкой
мы сами должны угадать с какой ошибкой вылетает?)
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 18:57  [ТС] 3
Цитата Сообщение от V0v1k Посмотреть сообщение
мы сами должны угадать с какой ошибкой вылетает?)
Я же написал, что не могу определить ошибку, поэтому и попросил помощи. Может в коде я что то не так пишу. Идея не правильная. Ошибка возникает у людей с которыми я не могу связаться.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 19:09 4
могу предположить что они получают диалог "апликейшен не отвечает. закрыть? да. нет.".

Добавлено через 36 секунд
попробуйте в другой поток вынести логику.
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 19:09  [ТС] 5
Цитата Сообщение от V0v1k Посмотреть сообщение
могу предположить что они получают диалог "апликейшен не отвечает. закрыть? да. нет.".
Очень смешно ...
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 19:56 6
Цитата Сообщение от dubok79 Посмотреть сообщение
программа подвисает
если программа подвисает на 5+ сек то именно такой диалог вылазит.
не вижу ничего смешного.
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 20:04  [ТС] 7
Цитата Сообщение от V0v1k Посмотреть сообщение
если программа подвисает на 5+ сек то именно такой диалог вылазит.
не вижу ничего смешного.
Я думал это был сарказм, прошу прощения.
Нет программа не подвисает, а именно вылетает с ошибкой. Т.е. закрывается. Вообще мой запрос к таблице провайдера имеет место быть? Может тут нельзя работать как с обычной таблицей? Или как мне посоветовали переписывать периодически все контакты к себе в таблицу и уже оттуда обрабатывать. Делать что-то вроде синхронизации.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 20:17 8
Цитата Сообщение от dubok79 Посмотреть сообщение
Нет программа не подвисает, а именно вылетает с ошибкой
ну некоторые могут воспринимают этот диалог за вылет, вы же у себя не смогли повторить...

Добавлено через 7 минут
кстати, смотрю примеры, везде сначала вызывают мувТуФирст
Java
1
2
3
4
5
6
7
cursor.moveToFirst();
  while(!cursor.isAfterLast()) {
 
            cursor.getString(cursor.getColumnIndex("column_name"));
 
        cursor.moveToNext();
    }
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 20:32  [ТС] 9
Цитата Сообщение от V0v1k Посмотреть сообщение
ну некоторые могут воспринимают этот диалог за вылет, вы же у себя не смогли повторить...

Добавлено через 7 минут
кстати, смотрю примеры, везде сначала вызывают мувТуФирст
Java
1
2
3
4
5
6
7
cursor.moveToFirst();
  while(!cursor.isAfterLast()) {
 
            cursor.getString(cursor.getColumnIndex("column_name"));
 
        cursor.moveToNext();
    }
Да уже поправил это дело у себя, но не думаю, что причина именно в этом....
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 20:35 10
без логов не разобраться.
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 20:48  [ТС] 11
Цитата Сообщение от V0v1k Посмотреть сообщение
без логов не разобраться.
Есть логи ошибок в маркете. сейчас выложу, может это они...

java.lang.RuntimeException: Unable to start receiver ru.alexeydubinin.holidays.Widget_4x1: android.database.sqlite.SQLiteException: near "YA": syntax error: , while compiling: INSERT INTO _tmp(comment, ND, NM) VALUES('NATAL'YA VETROVA - день рождения',27,5)
Вот так здрасти...я и не заметил... попался апостров ...

Добавлено через 3 минуты
а есть какая нить функция экранирования спец символов? На php такая была, может и тут есть.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 20:56 12
оу, а selection вам для чего?
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 20:57  [ТС] 13
Цитата Сообщение от V0v1k Посмотреть сообщение
оу, а selection вам для чего?
а это что за зверь?
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 21:00 14
сори, не то написал, щас уточню.

Добавлено через 45 секунд
selectionArgs - во. сюда все аргументы запроса а не конкатенацией строк.

Добавлено через 1 минуту
PreparedStatement, SQL injection - знакомые слова?
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 21:04  [ТС] 15
Цитата Сообщение от V0v1k Посмотреть сообщение
сори, не то написал, щас уточню.

Добавлено через 45 секунд
selectionArgs - во. сюда все аргументы запроса а не конкатенацией строк.

Добавлено через 1 минуту
PreparedStatement, SQL injection - знакомые слова?
Да конечно. selectionArgs я и использую. просто в имени попался апостроф. его конечно можно переделать как \`
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 21:10 16
покажите код.

в том что вы здесь выставили вы не используете...
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
07.02.2013, 08:21  [ТС] 17
Цитата Сообщение от V0v1k Посмотреть сообщение
покажите код.
да я немного по другому делал, т.к. использовал db.execSQL
сейчас переделал на db.insert, конечно все работает, но все-таки по мне как программисту БД код работы с БД в андроиде очень запутанный и вовсе не читабельный. Будем привыкать. Спасибо за помощь.

Добавлено через 8 минут
Ну вот как то так сделал:
Java
1
2
3
4
5
6
ContentValues cv = new ContentValues();
cv.put("comment", comment);
cv.put("ND", ND);
cv.put("NM", NM);
try{db.insert(MeData.DB_TABLE_TMP, "comment,ND,NM", cv);}
catch(SQLException e){Log.e("ERROR-INS-DB",e.getMessage());}
кстати, нужно писать cv=null; или не обязательно?
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
25.10.2013, 09:26  [ТС] 18
В первом посте мною написан метод получения дней рождения контактов. Недавно заметил, что появилась галочка, которая позволяет при внесении дня рождения не указывать год рождения. Из-за этого у некоторых пользователей полезли ошибки, т.к. извлечение составляющих даты стало происходить не верно.
Java
1
2
String date = cursor.getString(2); //у меня приходит в формате YYYY-MM-DD
String[] strdate = date.split("-");//все удачно получалось
Теперь, если стоит галка "Не указывать год", опять же у меня формат даты получается такой --MM-DD
Я стал дату разбирать так:
Java
1
2
int ND=Integer.parseInt(date.substring(date.length()-2, date.length()));
int NM=Integer.parseInt(date.substring(date.length()-5, date.length()-3));
У меня все работает на ура. Но у других пользователей стали приходит ошибки. Например месяц у меня по номеру месяца минус 1 берет из массива наименование месяцев, но вдруг приходит ошибка, что мол длин массива 12, позиция -2 или 28, т.е. ерунда какая то.
Вопрос такой: как из даты рождения контактов ПРАВИЛЬНО взять ее составляющие.
СПАСИБО ЗАРАНЕЕ!
Я так полагаю, формат даты может быть разным, отсюда и ошибки.
0
25.10.2013, 09:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2013, 09:26

Как получить контакты?
вот мой код package com.example.app; import android.app.ListActivity;...

Читаются ли контакты с Viber
Есть контент провайдер content://com.viber.provider.vibercontacts но ясно без...

Регистрация аккаунта разработчика после блокировки
В общем мне полгода назад прилетел бан. Доступа к панели разработчика нет....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru