I have 2 users (out of thousands) reporting this problem. I am at a loss as to why this is happening, also. It doesn't have anything to the data as the user claims they few rows. I even had them recreate their database (I have a backup facility that that backs up/restores from JSON) and the problem still occurs.
One guy took the phone back because he suspected a hardware issue. The other person never followed up, so I don't know if he solved it or what. On Wednesday, March 21, 2012 6:54:30 AM UTC+8, Dianne Hackborn wrote: > > You can get the SQLite version to perform acceptably. You just need to > use it correctly -- set up indices as appropriate as needed for joins and > such. I am not a SQL (lite or otherwise) expect in any way so I can't help > you with the particulars, but at the very least make sure you are actually > setting indices on the columns that are involved in deciding what rows are > included in the query result. > > Also all you are doing by putting your query in the main thread of your > process is causing your process to ANR when it takes a long time. The > query all happens in native code down in SQLite, so you won't see anything > in your java traces (nor typically anything interesting in native traces > either since most likely, yes, you are executing the query in SQLite). > > On Tue, Mar 20, 2012 at 3:22 PM, momo <[email protected]> wrote: > >> 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 > > > > > -- > Dianne Hackborn > Android framework engineer > [email protected] > > Note: please don't send private questions to me, as I don't have time to > provide private support, and so won't reply to such e-mails. All such > questions should be posted on public forums, where I and others can see and > answer them. > > -- 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

