Autore Topic: [facile] Creare Database da file csv  (Letto 15665 volte)

Offline Pinabello

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +12
    • Mostra profilo
  • Dispositivo Android:
    Htc Dream Tim
  • Sistema operativo:
    Mac os X
[facile] Creare Database da file csv
« il: 24 Giugno 2010, 18:06:20 CEST »
+6
Livello di difficoltà: facile
Versione SDK utilizzata: 1.6
Link al file compresso del progetto eclipse: file in allegato

Trovo molto pratico l'utilizzo di file csv per la gestione dei dati, sfortunatamente, benchè sia possibile caricare un file di questo tipo tramite la riga di comando da pc, non esiste un metodo integrato per inserire i dati nel momento in cui viene installata/aggiornata un'applicazione. Questo tutorial si propone di fornire una semplice implementazione a questa mancanza. Chiedo scusa se riutilizzo le classi e il progetto di un mio precedente tutorial ma il tempo è un Tiranno.

La prima componente da realizzare e il nostro file csv, per semplicità in questa implementazione inseriremo i dati in una sola tabella, per utilizzare la stessa soluzione per più tabelle viene richiesta la creazione di un file csv per ogni tabella. Il file dati.csv viene salvato nello stesso package che contiene la classe SimpleHeaderTutorialDB che estende SQLiteOpenHelper.

Codice (Java): [Seleziona]
1,Carote,V
2,Insalata,V
3,Pomodori,V
4,Melanzane,V
5,Cetrioli,V
6,Cipolle,V
7,Rucola,V
8,Mele,F
9,Pere,F
10,Arance,F
11,Mandarini,F
12,Banane,F
13,Sapone,C
14,Spazzolone,C
15,Stracci,C
16,Latte,A
17,Cereali,A
18,Biscotti,A
19,Pane,A
20,Pasta,A

Il cuore della funzione è il metodo load presente in SimpleHeaderTutorialDB che leggendo riga per riga il file csv esegue le insert sulla tabella.

Codice (Java): [Seleziona]
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                db.execSQL("DROP TABLE " + Spesa.TABLE_NAME);
                db.execSQL("CREATE TABLE " + Spesa.TABLE_NAME + " ("
                + Spesa.ID + " INTEGER PRIMARY KEY,"
                + Spesa.NAME + " TEXT,"
                + Spesa.TYPE + " TEXT"
                + ");");
                load(db, new InputStreamReader(this.getClass().getResourceAsStream("dati.csv")));
        }
       
        @Override
        public void onCreate(SQLiteDatabase db) {
                db.execSQL("CREATE TABLE " + Spesa.TABLE_NAME + " ("
                + Spesa.ID + " INTEGER PRIMARY KEY,"
                + Spesa.NAME + " TEXT,"
                + Spesa.TYPE + " TEXT"
                + ");");
                load(db, new InputStreamReader(this.getClass().getResourceAsStream("dati.csv")));
        }
       
        private void load(SQLiteDatabase db, InputStreamReader in) {
                BufferedReader reader = new BufferedReader(in);
                try {
                        String line = null;
                        while ( (line = reader.readLine()) != null ) {
                                db.insert(Spesa.TABLE_NAME, null, Spesa.getContentValues(line));
                        }
                        reader.close();
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        if (in != null) {
                                try {
                                        in.close();
                                } catch (IOException e) {
                                }
                        }
                }
        }

Ultimo, ma non meno importante, il metodo getContentValues(String value) che si occupa di trasformare ogni riga in un oggetto ContentValues da utilizzare per la insert. Unica nota : la classe StringTokenizer non gestisce correttamente i dati vuoti, ad esempio una riga "12,,F" causerà un errore perchè i valori ritornati sarranno soltanto "12" e "F" e non "12", "", "F". Nel caso in cui si debbano gestire campi null sarà necessario implementare un metodo che tagli la riga secondo le nostre esigenze.

Codice (Java): [Seleziona]
public static ContentValues getContentValues(String value) {
        ContentValues result = new ContentValues();
        StringTokenizer stringTokenizer = new StringTokenizer(value, ",");
        result.put(Spesa.ID, stringTokenizer.nextToken());
        result.put(Spesa.NAME, stringTokenizer.nextToken());
        result.put(Spesa.TYPE, stringTokenizer.nextToken());
        return result;
}

Nel caso in cui si volesse utilizzare un file sql con istruzioni in puro sql per eseguire le insert è sufficente utilizzare il metodo "execSQL(String sql)" al posto di insert (String table, String nullColumnHack, ContentValues values)  all'iterno del metodo load.



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:[facile] Creare Database da file csv
« Risposta #1 il: 25 Agosto 2010, 10:29:58 CEST »
0
Premetto che sono nuovo di android.
Ho provato ad adattare il tuo progetto ad una tabella contenente più campi (8).
Ma quando lancio il progetto ottengo un errore.

Puoi verificare di cosa si tratta? (penso che il problema risieda in "SimpleListActivity.java").

Ciao

Offline Pinabello

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +12
    • Mostra profilo
  • Dispositivo Android:
    Htc Dream Tim
  • Sistema operativo:
    Mac os X
Re:[facile] Creare Database da file csv
« Risposta #2 il: 25 Agosto 2010, 11:02:43 CEST »
+1
Ciao,
ho provato il tuo codice ed ho trovato due errori :

1) Banche.java : il campo CITTA non può contenere " ' " nel nome in quanto non è un carattere valido per i nomi dei campi delle tabelle

Errato
Codice (Java): [Seleziona]
public final static String CITTA                        = "CITTA'";
Corretto
Codice (Java): [Seleziona]
public final static String CITTA                        = "CITTA";
2) SimpleHeaderTutorialDB.java : nella creazione della tabella manca uno spazio prima del tipo campo "TEXT", questo generava una sintassi di creazione tabella errata,

Errato
Codice (Java): [Seleziona]
public void onCreate(SQLiteDatabase db) {
                db.execSQL("CREATE TABLE " + Banche.TABLE_NAME + " ("
                + Banche.ID + " INTEGER PRIMARY KEY,"
                + Banche.ABI + " TEXT,"
                + Banche.DENOMINAZIONE + " TEXT,"
                + Banche.CAB + " TEXT,"
                + Banche.FILIALE + "TEXT,"
                + Banche.CITTA + "TEXT,"
                + Banche.PROVINCIA + "TEXT,"
                + Banche.TYPE + " TEXT"
                + ");");
                load(db, new InputStreamReader(this.getClass().getResourceAsStream("dati.csv")));
        }

Corretto
Codice (Java): [Seleziona]
        public void onCreate(SQLiteDatabase db) {
                db.execSQL("CREATE TABLE " + Banche.TABLE_NAME + " ("
                + Banche.ID + " INTEGER PRIMARY KEY,"
                + Banche.ABI + " TEXT,"
                + Banche.DENOMINAZIONE + " TEXT,"
                + Banche.CAB + " TEXT,"
                + Banche.FILIALE + " TEXT,"
                + Banche.CITTA + " TEXT,"
                + Banche.PROVINCIA + " TEXT,"
                + Banche.TYPE + " TEXT"
                + ");");
                load(db, new InputStreamReader(this.getClass().getResourceAsStream("dati.csv")));
        }

Dopo queste correzioni la lista si visualizza correttamente :)

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:[facile] Creare Database da file csv
« Risposta #3 il: 25 Agosto 2010, 11:41:26 CEST »
0
Grazie per la risposta. Tutto OK.

Se però volessi vedere altri campi nella listview, dove devo agire?


Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:[facile] Creare Database da file csv
« Risposta #4 il: 07 Ottobre 2010, 23:24:27 CEST »
0
Se volessi importare dati da un file di testo .txt al posto di un file .csv funziona lo stesso????
Grazie ciao

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:[facile] Creare Database da file csv
« Risposta #5 il: 08 Ottobre 2010, 08:57:37 CEST »
0
Se volessi importare dati da un file di testo .txt al posto di un file .csv funziona lo stesso????
Grazie ciao
I file csv sono file di testo. Csv non significa altro che comma separated values, cioé valori separati da virgola. La cosa importante é che rispetti la sintassi del file. Di certo non puoi scrivere dati che non rispettano questa codifica e aspettarti che vengano letti da questo codice.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline coverx

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
Re:[facile] Creare Database da file csv
« Risposta #6 il: 15 Marzo 2011, 17:55:07 CET »
0
Scusate, ma se invece il mio csv è separato da punto e virgola invece della virgola?

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:[facile] Creare Database da file csv
« Risposta #7 il: 15 Marzo 2011, 18:23:23 CET »
+1
Scusate, ma se invece il mio csv è separato da punto e virgola invece della virgola?

Puoi facilmente personalizzare la funzione getContentValues con qualsiasi delimitatore tu abbia.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline coverx

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
Re:[facile] Creare Database da file csv
« Risposta #8 il: 16 Marzo 2011, 11:34:30 CET »
0
Ah, grazie mille non avevo notato il punto di scelta del token.
Approfitto per fare un'altra domanda però  O:-), se volessi richiamare il metodo load solo ad un determinato momento?
Cioè noto che da come è impostato, ogni volta che l'applicazione parte aggiorna il database, ma se volessi aggiornarlo solo dopo il click su un bottone? Da come ho provato non riesco a richiamare la funzione load dall'esterno, come posso modificarlo?
Grazie mille, e scusate ma sono appena all'inizio.

Offline coverx

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
Re:[facile] Creare Database da file csv
« Risposta #9 il: 18 Marzo 2011, 17:13:11 CET »
0
Scusate, purtroppo oltre alla richiesta precedente, avrei bisogno di sapere anche un'altra cosa, e cioè:
Con get ResourceAsStream "prendo" il file csv dalla cartella src del progetto, ma ho la necessità di cambiare questo path....è possibile caricare un file csv magari memorizzato dinamicamente nella cartella data/data/package/??? Ovviamente ho provato gia a cambiare semplicemente il path ma non succede niente quindi non so se è un errore mio o altro.
Scusate ancora per le tante richieste, ma questo forum è il mio unico appoggio.
Grazie a tutti

Offline ienariden

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
Re:[facile] Creare Database da file csv
« Risposta #10 il: 05 Agosto 2011, 18:05:50 CEST »
0
scusate ma per scaricare l'allegato?

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:[facile] Creare Database da file csv
« Risposta #11 il: 08 Agosto 2011, 17:09:44 CEST »
0
scusate ma per scaricare l'allegato?

Basta cliccare sul link sotto al post, dove c'è una graffetta. :-)
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline Nikolas534

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    windows 7
Re:[facile] Creare Database da file csv
« Risposta #12 il: 12 Novembre 2011, 19:21:16 CET »
0
Salve,
ma volendo implementare in questo tutorial un EditText per la ricerca nella lista come fare? Dove bisogna inserire i cambiamenti???
Grazie  :-)

Offline esempio

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:[facile] Creare Database da file csv
« Risposta #13 il: 18 Novembre 2011, 10:06:19 CET »
0
ciao grazie per il tutorial!

mi è sorto un problema caricando un file csv con lettere accentate (è, à, ò ...)
al loro posto viene stampato un simbolo con un punto interrogativo  <?>

le lettere accentate mancano propio nel font standard di android o bisogna cambiare qualcosa nell'importazione?
es. codifica UTF-8, Ascii

grazie

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:[facile] Creare Database da file csv
« Risposta #14 il: 18 Gennaio 2012, 08:49:23 CET »
0
ma se il file è molto grande (10000 o 100000 righe) c'e' un modo per velocizzare il processo?