I'm rewriting a simple translation app with a SQLite db.  There is an 
extreme hit to performance between two queries, but only on certain devices.

One query lists the english words in a ListView, the other lists the 
secondary language in a list view.  The data is structured differently, and 
is from a remote server.

Both are single SQL statements, run via db.rawQuery.  Both use AsyncTask to 
keep heavy lifting in another thread.

On both devices, the "english" query returns almost instantly (less than 1 
second, every time): 

return db.rawQuery("select _id as id, english as label from english_words 
order by english collate nocase", null);

On one device, the "secondary_langauge" query returns almost instantly as 
well.  No problem there, ever.  This is a Samsung Galaxy SII.  On another 
device (Samsung Nexus S), this query takes around 30 seconds.  This query 
has some joins, as follows:

return db.rawQuery("select definitions._id as id, secondary_language as 
label from english_words join definition_bridge on 
english_words._id=definition_bridge.word_id join definitions on 
definitions._id=definition_bridge.definition_id order by 
secondary_language", null);

I ran it in the emulator once, and got the same result as the Nexus S (the 
30 second hang).  It took a little 1.5 hours to download and parse the 
returns from the server on the emulator (which takes a few seconds on 
either device), so I gave up on further debug with the emulator at that 
point.

This is the only difference between the two operations.  The listView is 
the same, the adapter is the same, the AsyncTask is the same.  The number 
of rows returned is different - there are about 2000 english words, and a 
little over 3000 words in the other language.  I don't think this explains 
the vast difference in performance.

I took the query out of the AsyncTask to see if I could get some more debug 
info, and did get an ANR:

  at android.database.sqlite.SQLiteQuery.native_fill_window(Native Method)
  at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:73)
  at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:287)
  at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:268)
  at com.whatever.adapters.WordListAdapter.getCount(WordListAdapter.java:39)

I rewrote the adapter's getCount method to return a cached count 
(determined during instantiation).  After, I didn't get an ANR again, but 
otherwise the performance was not improved and the query still took around 
30 seconds.

I'm totally at a loss.  As mentioned, everything but the queries is 
identical.  And on the Galaxy SII, there is no problem at all - less than a 
second to populate the ListView, even under abuse (touching the button that 
launches the request as fast as I could).

At this point, I'm wondering if it'd be better to abandon SQLite entirely, 
and using a Java model to manage data.  Assuming I can't get the SQLite 
version to perform reasonably, what could I expect in terms of performance 
using Collections (with the number of entries mentioned above), when I need 
to do a search for example (which I imaging would require iterating over 
the whole thing on each key event).

Any advice?

TYIA.

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to