4

I need some assistance with this.

I am trying to query the strequent table (ContactsContract.CONTENT_STREQUENT_URI) on Android to get starred and most frequently contacted contacts.

Cursor cursor = context.getContentResolver().query(Contacts.CONTENT_STREQUENT_URI,
                            new String[]{Contacts._ID, Contacts.LOOKUP_KEY, Contacts.STARRED, Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY
                                    : Contacts.DISPLAY_NAME}, null,
                            null, null
                    );

On most devices and Android versions it works fine. But on Android 4.1.2 versions I'm getting this SQLiteException

{AsyncTask #2} android.database.sqlite.SQLiteException: near "(": syntax error (code 1): ,
 while compiling: SELECT * FROM (SELECT _id, lookup, starred, display_name, 9223372036854775807
 AS times_used, 9223372036854775807 AS last_time_used FROM view_contacts WHERE 
(view_contacts.[single_is_restricted] = 0(1)) AND (starred=1) GROUP BY _id ORDER 
BY display_name COLLATE LOCALIZED ASC) UNION ALL SELECT * FROM (SELECT _id, 
lookup, starred, display_name, SUM(data_usage_stat.times_used) AS times_used, 
MAX(data_usage_stat.last_time_used) AS last_time_used FROM view_data_usage_stat AS 
data_usage_stat INNER JOIN view_contacts ON ((data_usage_stat.times_used > 0) AND 
(contact_id=view_contacts._id)) WHERE (view_contacts.[single_is_restricted] = 0 
AND ((starred =0 OR starred IS NULL) AND account_type NOT IN 
('com.android.contacts.sim'))) GROUP BY _id HAVING contact_id IN default_directory 
ORDER BY (CASE WHEN (strftime('%s', 'now') - last_time_used/1000) < 259200 THEN 0 
WHEN (strftime('%s', 'now') - last_time_used/1000) < 2592000 THEN 1 ELSE 2 END), 
times_used DESC LIMIT 10) at 
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:184) at 
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140) at 
android.content.ContentProviderProxy.query(ContentProviderNative.java:366) at 
android.content.ContentResolver.query(ContentResolver.java:371) at 
android.content.ContentResolver.query(ContentResolver.java:314) at 
(...)

I'm pretty sure that this other SQLiteException that I'm getting on Android 4.4.2 versions is related:

 android.database.sqlite.SQLiteException: near ")": syntax error (code 1): , while 
compiling: SELECT * FROM (SELECT _id, lookup, starred, display_name, 
9223372036854775807 AS times_used, 9223372036854775807 AS last_time_used FROM 
view_contacts WHERE (view_contacts.[single_is_restricted] = 0 AND ) AND 
(starred=1) GROUP BY _id ORDER BY display_name COLLATE LOCALIZED ASC) UNION ALL 
SELECT * FROM (SELECT _id, lookup, starred, display_name, 
SUM(data_usage_stat.times_used) AS times_used, MAX(data_usage_stat.last_time_used) 
AS last_time_used FROM view_data_usage_stat AS data_usage_stat INNER JOIN 
view_contacts ON ((data_usage_stat.times_used > 0) AND 
(contact_id=view_contacts._id)) WHERE (view_contacts.[single_is_restricted] = 
0((starred =0 OR starred IS NULL) AND account_type NOT IN 
('com.android.contacts.sim'))) GROUP BY _id HAVING contact_id IN default_directory 
ORDER BY (CASE WHEN (strftime('%s', 'now') - last_time_used/1000) < 259200 THEN 0 
WHEN (strftime('%s', 'now') - last_time_used/1000) < 604800 THEN 1 WHEN 
(strftime('%s', 'now') - last_time_used/1000) < 1209600 THEN 2 WHEN 
(strftime('%s', 'now') - last_time_used/1000) < 2592000 THEN 3 ELSE 4 END), 
times_used DESC LIMIT 10) WHERE (strftime('%s', 'now') - last_time_used/1000)
<2592000 at 
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:181) at 
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) at 
android.content.ContentProviderProxy.query(ContentProviderNative.java:413) at 
android.content.ContentResolver.query(ContentResolver.java:464) at 
android.content.ContentResolver.query(ContentResolver.java:407) at 
(...)

My understanding is that Android Content Resolver is building the SQL query incorrectly. Am I missing something? Has anyone encountered this or can suggest a workaround? Is there another/simpler query that can be used? I would like to maintain this feature for these Android versions :(

acrespo
  • 1,134
  • 1
  • 10
  • 33

0 Answers0