Autore Topic: Prestazioni Insert Sqlite  (Letto 685 volte)

Offline sncmll

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
Prestazioni Insert Sqlite
« il: 22 Febbraio 2014, 00:49:07 CET »
0
Ciao ragazzi,
ho dato un'occhiata sul forum ma purtroppo non ho trovato nulla che potesse fare al caso mio.

Il mio problema consiste nel fatto che quando,all'avvio della mia applicazione, inserisco 200-300 record all'interno di un db sqlite:

- in un dispositivo LG L9(ANDROID 4.2) il tutto viene eseguito in meno di un secondo;

- in un dispositivo HTC WILDFIRE(ANDROID 2.2) , l'esecuzione si blocca all'inserimento del primo record; la cosa buffa è che se ne inserisco 10     tutto funziona, se ne inserisco 11 tutto si blocca.


Mi rendo conto che l'HTC WILDFIRE abbia caratteristiche tecniche nettamente inferiori, ma perché (anche se lo lascio lavorare per ore) rimane sempre fermo alla prima tupla?


Ho adottato un approccio BULK insertion effettuando tutti gli inserimenti all'interno di una transazione, ottenendo risultati sensazionali sull'LG L9, ma fallendo sull'HTC.


Codice (Java): [Seleziona]
// inserisci ricette in blocco
        public void insertRicetteEIngredientiInBlocco(List<Tupla> tupleItem,
                        List<Tupla> tupleTag, AsyncDownloadRicette asyncdownload) {
                String sql = "insert into RICETTE values (?, ?, ?, ?, ?,?, ?, ?, ?, ?,?, ?, ?, ?, ?,?,?);";
                String sql2 = "insert into INGREDIENTI values (?, ?);";
                db.beginTransaction();
                SQLiteStatement stmt = db.compileStatement(sql);
                SQLiteStatement stmt2 = db.compileStatement(sql2);
                try {
                        int i = 0;
                        for (; i < tupleItem.size(); i++) {// total da mettere

                                TuplaItem tuplaItem = (TuplaItem) tupleItem.get(i);

                                stmt.bindLong(1, tuplaItem.getId());
                                stmt.bindString(2, tuplaItem.getTitle());
                                stmt.bindString(3, tuplaItem.getWebPage());
                                stmt.bindString(4, tuplaItem.getCategory());
                                stmt.bindString(5, tuplaItem.getIntrotext());
                                stmt.bindString(6, tuplaItem.getFulltext());
                                stmt.bindString(7, tuplaItem.getTempo());
                                stmt.bindString(8, tuplaItem.getQuantita());
                                stmt.bindString(9, tuplaItem.getComplessita());
                                stmt.bindString(10, tuplaItem.getCalorie());
                                stmt.bindString(11, tuplaItem.getBevanda());
                                stmt.bindString(12, tuplaItem.getTipoPiatto());
                                stmt.bindString(13, tuplaItem.getCuriositaText());
                                stmt.bindString(14, tuplaItem.getImageUrl());
                                stmt.bindString(15, tuplaItem.getCuriositaImageUrl());
                                stmt.bindString(16, "");
                                stmt.bindString(17, "");

                                long entryID = stmt.executeInsert();
                                stmt.clearBindings();

                                asyncdownload.publishProgressFromExt(i);
                        }

                        for (int j = 0; j < tuplaTag.size(); j++) {// total da mettere

                                TuplaTag tuplaTag = (TuplaTag) tupleTag.get(j);

                                stmt2.bindLong(1, tuplaTag.getItemid());
                                stmt2.bindString(2, tuplaTag.getTag());

                                long entryID = stmt2.executeInsert();
                                stmt2.clearBindings();
                                asyncdownload.publishProgressFromExt(i++);
                        }

                        db.setTransactionSuccessful();
                } finally {
                        db.endTransaction();
                }

        }


Vi ringrazio in anticipo per la vostra attenzione.
Ciao! :D


 
« Ultima modifica: 22 Febbraio 2014, 01:07:57 CET da sncmll »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Prestazioni Insert Sqlite
« Risposta #1 il: 22 Febbraio 2014, 11:06:32 CET »
+1
Un problema da tenere in considerazione è la versione di SQLite a bordo di Android 2.2. Se hai voglia di sperimentare, prova con un emulatore android 2.2 e vedi se si ripete il problema. Poi sarebbe da capire che versioni di SQLite sono installate e se ci sono bug noti e relativi workaround.

In generale, fosse stato android 2.3x , lo avrei considerato un problema, visto lo share di device 2.3x. Ma trattandosi del 2.2 mi sento di dirti con tranquillità di non supportarlo. E se il tuo scopo è continuare ad usare quel terminale (HTC wildfire), la Cyanogen ci gira.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline sncmll

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
Re:Prestazioni Insert Sqlite
« Risposta #2 il: 22 Febbraio 2014, 16:00:29 CET »
0
Ciao, anzitutto grazie per aver risposto.
L'HTC lo uso principalmente per testare la retro-compatibilità delle applicazioni che sviluppo.

Quindi tu reputi che il problema sia relativo alla versione del sistema operativo??
Anche se il problema si presenta solo quando il numero di insert consecutive è maggiore di 10?
Adesso provo con un emulatore con Android 2.2

Ti chiedo scusa, ma non ho capito che cosa intendi per "share di device 2.3x"; pensi che queste operazioni di insert non siano compatibili nemmeno in dispositivi 2.3x?

Grazie mille! :D

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Prestazioni Insert Sqlite
« Risposta #3 il: 22 Febbraio 2014, 17:50:52 CET »
+1
La 2.2 è ormai scomparsa, ci sono le 2.3x come ultime rimaste della versione 2:

Dashboards | Android Developers
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline sncmll

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
Re:Prestazioni Insert Sqlite
« Risposta #4 il: 22 Febbraio 2014, 18:16:36 CET »
0
Scusami :)
Non avevo capito nulla! :D

Adesso mi è tutto chiaro ciò che hai detto !

A questo punto sono curioso di vedere se questo problema si presenta anche su 2.3.x

Grazie mille !