Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
#1

Контакты с гугл аккаунта - Программирование Android

06.02.2013, 16:55. Просмотров 1247. Ответов 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-ю строками. Промежуточную базу использую для сортировки данных из разных источников.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 16:55     Контакты с гугл аккаунта
Посмотрите здесь:

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

Регистрация аккаунта разработчика - Программирование Android
Здравствуйте! Обращаюсь ко всем кто регистрировал аккаунт разработчика. Скажите, пожалуйста, карта для оплаты нужна в долларах или...

Разметка (фон аккаунта) - Программирование Android
Как сделать черный прямоугольник на фона аккаунта как на скрине со "Стивом Джобсом")?

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

Как получить контакты? - Программирование Android
вот мой код package com.example.app; import android.app.ListActivity; import android.database.Cursor; import...

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

Регистрация аккаунта разработчика после блокировки - Программирование Android
В общем мне полгода назад прилетел бан. Доступа к панели разработчика нет. Подумываю на другого человека зарегать новый аккаунт. И тут...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 18:48     Контакты с гугл аккаунта #2
Цитата Сообщение от dubok79 Посмотреть сообщение
вылетает с ошибкой
мы сами должны угадать с какой ошибкой вылетает?)
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 18:57  [ТС]     Контакты с гугл аккаунта #3
Цитата Сообщение от V0v1k Посмотреть сообщение
мы сами должны угадать с какой ошибкой вылетает?)
Я же написал, что не могу определить ошибку, поэтому и попросил помощи. Может в коде я что то не так пишу. Идея не правильная. Ошибка возникает у людей с которыми я не могу связаться.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 19:09     Контакты с гугл аккаунта #4
могу предположить что они получают диалог "апликейшен не отвечает. закрыть? да. нет.".

Добавлено через 36 секунд
попробуйте в другой поток вынести логику.
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 19:09  [ТС]     Контакты с гугл аккаунта #5
Цитата Сообщение от V0v1k Посмотреть сообщение
могу предположить что они получают диалог "апликейшен не отвечает. закрыть? да. нет.".
Очень смешно ...
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 19:56     Контакты с гугл аккаунта #6
Цитата Сообщение от dubok79 Посмотреть сообщение
программа подвисает
если программа подвисает на 5+ сек то именно такой диалог вылазит.
не вижу ничего смешного.
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 20:04  [ТС]     Контакты с гугл аккаунта #7
Цитата Сообщение от V0v1k Посмотреть сообщение
если программа подвисает на 5+ сек то именно такой диалог вылазит.
не вижу ничего смешного.
Я думал это был сарказм, прошу прощения.
Нет программа не подвисает, а именно вылетает с ошибкой. Т.е. закрывается. Вообще мой запрос к таблице провайдера имеет место быть? Может тут нельзя работать как с обычной таблицей? Или как мне посоветовали переписывать периодически все контакты к себе в таблицу и уже оттуда обрабатывать. Делать что-то вроде синхронизации.
V0v1k
1158 / 982 / 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();
    }
dubok79
323 / 121 / 11
Регистрация: 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();
    }
Да уже поправил это дело у себя, но не думаю, что причина именно в этом....
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 20:35     Контакты с гугл аккаунта #10
без логов не разобраться.
dubok79
323 / 121 / 11
Регистрация: 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 такая была, может и тут есть.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 20:56     Контакты с гугл аккаунта #12
оу, а selection вам для чего?
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
06.02.2013, 20:57  [ТС]     Контакты с гугл аккаунта #13
Цитата Сообщение от V0v1k Посмотреть сообщение
оу, а selection вам для чего?
а это что за зверь?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.02.2013, 21:00     Контакты с гугл аккаунта #14
сори, не то написал, щас уточню.

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

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

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

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

в том что вы здесь выставили вы не используете...
dubok79
323 / 121 / 11
Регистрация: 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; или не обязательно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2013, 09:26     Контакты с гугл аккаунта
Еще ссылки по теме:

Блокировка приложений и аккаунта в консоли разработчика - Программирование Android
Здравствуйте. Выпустил примерно полгода назад приложение справочник по онлайновой игрушке (Dota). Все замечательно, пользователи рады,...

Если контакты сохранены на сим карте,то не отображается - Программирование Android
Здравствуйте! Собственно по сабжу: как сделать, что бы приложение видело контакты и с сим карты? Заранее спс!

Как сохранить контакт из моей БД в телефонные контакты? - Программирование Android
У меня есть приложение, в которое заносятся клиенты и сохраняются в мою базу данных. Нужно, чтобы при нажатии на кнопку, выбранный контакт...

Не получается оплатить 25$ при активации аккаунта Google Play - Программирование Android
Cтолкнулся с проблемой - не получется оплатить 25$ для активации аккаунта в гугл плэй(( пытаюсь оплатить карточкой Visa Electron - пишет...

SignInButton - при повторном нажатии окно выбора аккаунта не показывается - Программирование Android
Здравствуйте уважаемы форумчане, столкнулся с такой бедой. Я создал кнопку SignInButton при нажатии по которой вызывается вот такая...


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

Или воспользуйтесь поиском по форуму:
dubok79
323 / 121 / 11
Регистрация: 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, т.е. ерунда какая то.
Вопрос такой: как из даты рождения контактов ПРАВИЛЬНО взять ее составляющие.
СПАСИБО ЗАРАНЕЕ!
Я так полагаю, формат даты может быть разным, отсюда и ошибки.
Yandex
Объявления
25.10.2013, 09:26     Контакты с гугл аккаунта
Ответ Создать тему
Опции темы

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