Autore Topic: Consiglio su velocizzazione riempimento database  (Letto 1106 volte)

Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Consiglio su velocizzazione riempimento database
« il: 12 Gennaio 2011, 23:33:07 CET »
0
Salve,

la mia app al primo avvio deve riempire il database, per riempirlo va a pescare una serie di informazioni da alcuni file txt su web.
I file sono una ventina e per questo motivo la app impiega 4 minuti circa per effettuare l'inizializzazione del db sull'emulatore. Sul device ci metterà minimo il doppio.
E' davvero troppo!!
Come è possibile aggirare il problema?

Avevo pensato di prendere il file sql generato sull'emulatore e di metterlo nella cartelle della app per poter importare direttamente quel file invece di ricrearlo al primo avvio sul device dell'utente.

E' possibile fare questo?

Grazie

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:Consiglio su velocizzazione riempimento database
« Risposta #1 il: 13 Gennaio 2011, 01:08:21 CET »
0
Ho una doppia domanda: ma i 4 minuti servono all'elaborazione dei file di testo oppure al loro download? Dovresti provare a vedere quanto ci mette mettendo i file direttamente nel progetto, così da farti un'idea di quale operazione pesa di più.

Il discorso di copiare il file sql direttamente negli assets è possibile, ma altri utenti hanno trovato problemi ancora irrisolti ed io personalmente non lo farei mai per eventuali problemi di compatibilità. Piuttosto, dovessi farlo per me, ci copierei i file di testo da cui viene creato, oppure un file di testo con le query SQL per riempirlo. Ma questo dipende dalla natura del database e dei suoi contenuti.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Re:Consiglio su velocizzazione riempimento database
« Risposta #2 il: 13 Gennaio 2011, 01:13:26 CET »
0
Ho provato a mettere tutto in un unico file.
E' quasi 1MB!!e sono circa 12000 righe.
Credo sia inevitabile metterci tanto a processarlo riga per riga!!

Che soluzione mi consiglieresti?

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:Consiglio su velocizzazione riempimento database
« Risposta #3 il: 13 Gennaio 2011, 08:34:13 CET »
0
Ho provato a mettere tutto in un unico file.
E' quasi 1MB!!e sono circa 12000 righe.
Credo sia inevitabile metterci tanto a processarlo riga per riga!!

Per capire io: tu hai messo tutte le query SQL degli inserimenti in un file di testo, che è venuto 1MB, e lo hai incluso nei file di assets e ci ha messo 4 minuti a processarlo?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Consiglio su velocizzazione riempimento database
« Risposta #4 il: 13 Gennaio 2011, 10:07:26 CET »
0
Dovresti postare un po' di codice altrimenti è difficile suggerirti eventuali ottimizzazioni.
Comunque se fai gli inserimenti in un ciclo assicurati di usare SQLiteStatement
perchè dovrebbe essere decisamente più veloci.


Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Re:Consiglio su velocizzazione riempimento database
« Risposta #5 il: 13 Gennaio 2011, 10:28:17 CET »
0
Ho messo tutti i dati da processare dentro un unico file di testo e questo file di testo è 1mb
Avevo paura ci mettesse tanto a leggerli uno alla volta, dato che ognuno stava ad un indirizzo web diverso.
L'operazione più onerosa è il parsing del testo (120000 righe!!)
Devo evitarlo in qualche modo...
« Ultima modifica: 13 Gennaio 2011, 10:30:26 CET da dessorry »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Consiglio su velocizzazione riempimento database
« Risposta #6 il: 13 Gennaio 2011, 10:32:47 CET »
0
Creati un webservice e popolalo on-demand.

Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Re:Consiglio su velocizzazione riempimento database
« Risposta #7 il: 13 Gennaio 2011, 10:36:24 CET »
0
Aspetta aspetta...
Vediamo se ho capito:
mi creo una pagina php che fa l'operazione di parsing?
Però poi col cellulare dovrei andare a leggere la pagina php parsata, impiegherei comunque molto tempo!
Forse sarebbe ancora meglio se leggessi direttamente il database dalla pagina web...

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:Consiglio su velocizzazione riempimento database
« Risposta #8 il: 13 Gennaio 2011, 12:41:10 CET »
+1
@desorry
Ciao.
Ieri sera ho risolto come copiare il database dalla asset grazie alla classe AlmanacSQLiteDatabaseAdapter utilizzata da Vytek nel suo progetto Almanac 0.0.17 .
Posso dirti questo:
1)importa il database sqlite che hai creato col tuo metodo (leggere i record riga per riga) che trovi nella directory databases della tua applicazione;
2)copia questo db nella asset della tua applicazione
3)utilizza AlmanacSQLiteDatabaseAdapter.java che trovi in http://code.google.com/p/almanac/source/browse/trunk/Almanac/src/it/almanac/AlmanacSQLiteDatabaseAdapter.java?r=56 adattandolo alle tue esigenze;
4)nella classe che utilizza il database (ad esempio quella che fa delle query), nel caso dell'applicazione di Vytek, AlmanacList.java, scrivi una cosa del genere (ti consiglio comunque di guardare bene quel file).
Codice (Java): [Seleziona]
        public class AlmanacList extends Activity {
//.
//.
private static final String ALMANAC_DATABASE_NAME = "almanac.db";
//.
//.
        public boolean getFirstRun() {
                return mPrefs.getBoolean("firstRun", true);
        }
        public void setRunned() {
                SharedPreferences.Editor edit = mPrefs.edit();
                edit.putBoolean("firstRun", false);
                edit.commit();
        }
//. etc
//. etc
//. etc

        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);    
                setContentView(R.layout.almanaclist);

                firstRunPreferences();

                AlmanacSQLiteDatabaseAdapter aSQLiteDatabaseAdapter = AlmanacSQLiteDatabaseAdapter
                .getInstance(this, ALMANAC_DATABASE_NAME);
                // OK Dovrei usare aSQLiteDatabaseAdapter.getDatabase(); ma questo crea
                // problemi nella fase di OnPause quando premo Back cosi' invece non
                // ottengo errori
                // e viene fatta la normale copia del DB (13/8/2010 23.18)
                // db = aSQLiteDatabaseAdapter.getWritableDatabase();
                // Per ovviare a questo problema controllo se e' la prima volta che
                // chiamo applicazione
                if (getFirstRun()) {
                        db = aSQLiteDatabaseAdapter.getDatabase();
                        setRunned();
                } else {
                        db = aSQLiteDatabaseAdapter.getWritableDatabase();
                }

/. etc (fai delle query sul db

Nelle cose che ho scritto potrebbero esserci delle incongruenze. Prova e poi dimmi come è andata.

PS
Nel mio caso la lettura riga per riga impiegava oltre 3 minuti (per 33.000 record), in questo modo il db viene copiato in 2/3 secondi  ;-)
« Ultima modifica: 13 Gennaio 2011, 12:46:06 CET da giumazzi »

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:Consiglio su velocizzazione riempimento database
« Risposta #9 il: 13 Gennaio 2011, 12:53:15 CET »
0
Un'altra cosa MOLTO importante.

CHIAMA IL TUO DB CON L'ESTENSIONE JPG (o mp3, mov) questo perchè android ha il limite di 1 mb per i file di testo o simili nella asset, mentre NON HA limiti per i file multimediali!

Ciao

Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Re:Consiglio su velocizzazione riempimento database
« Risposta #10 il: 13 Gennaio 2011, 12:54:19 CET »
0
Ahahah! che barbatrucco!

grazie, stasera ci provo e ti faccio sapere!

Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Re:Consiglio su velocizzazione riempimento database
« Risposta #11 il: 13 Gennaio 2011, 20:39:39 CET »
0
Caro giumazzi, io mi blocco già a questo punto:
Citazione
1)importa il database sqlite che hai creato col tuo metodo (leggere i record riga per riga) che trovi nella directory databases della tua applicazione;
Nella cartella del workspace non trovo il db.

@Ricky
non mi hai risposto, potresti essere più chiaro sul discorso del webservice?


grazie a entrambi

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:Consiglio su velocizzazione riempimento database
« Risposta #12 il: 13 Gennaio 2011, 22:03:39 CET »
0
Sei proprio tabula rasa sui db  :D

Allora, hai presente DDMS? (la zona di eclipse dove vedi come procede l'applicazione... logcat....) OK?
Nella parte destra in alto (almeno per me) vedi il file system dell'emulatore, dove vedi le directory principali, devi entrare in data/data/my.package/databases (dove my.package sta per il TUO package) lì c'è il database che avevi creato leggendo i record  col tuo metodo riga per riga.

Adesso scordati la tua applicazione, fanne una copia se vuoi, e impostane un'altra partendo dal database helper di Vytek (almanac). Copia quel db nella "nuova" cartella asset della tua nuova applicazione e segui quello che ho postato precedentemente.

Ciao

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Consiglio su velocizzazione riempimento database
« Risposta #13 il: 14 Gennaio 2011, 08:43:43 CET »
0
@Ricky
non mi hai risposto, potresti essere più chiaro sul discorso del webservice?

Lo so che non ti ho risposto, abbi pazienza ;)
Comunque la mia era una idea piuttosto astratta. Per alcune tipologie di applicazione non è detto che il db debba riesedere interamente nell'app già da quando viene installata. Potresti infatti rilasciarla con dei dati parziali e caricare dinamicamente dal web quelli che ti servono e aggiungerli al database. Ma ti ribadisco che questa soluzione va bene solo in alcuni scenari e non è detto che il tuo sia uno di questi.