Autore Topic: Database e assets  (Letto 989 volte)

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Database e assets
« il: 12 Agosto 2011, 09:33:48 CEST »
0
ciao,
sapete dirmi se esiste un modo veloce per far leggere ad android un file sql contenente tot query da eseguire?
In alternativa ho pensato che la cosa migliore sia quella di inserire nella cartella Assets il file .sql e di far leggere nel metodo onCreate di una classe che estende SQLiteOpenHelper.
Ho quindi cercato sul forum e ho trovato una snippet di JD che permette di leggere file in quella cartella, ho creato una classe per facilitarmi il lavoro e per utilizzarla anche in altri file...solo che mi viene richiesto il contesto dell'applicazione:

Codice (Java): [Seleziona]
in = new BufferedReader(new InputStreamReader(context.getAssets().open(fileName)));
come faccio a recuperarlo dalla classe Database?

Esiste qualche altra alternativa al mio approccio?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Database e assets
« Risposta #1 il: 12 Agosto 2011, 09:48:29 CEST »
0
il Context lo passi dall'activity o dall'application!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Database e assets
« Risposta #2 il: 12 Agosto 2011, 10:00:50 CEST »
0
il Context lo passi dall'activity o dall'application!

Quindi come dovrei fare?
la mia classe Database è così:

Codice (Java): [Seleziona]
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class Database {  

        SQLiteDatabase mDb;
        DbHelper mDbHelper;
        Context mContext;
        private static final String DB_NAME="database";//nome del db
        private static final int DB_VERSION=2; //numero di versione del nostro db      
       
        public Database(Context ctx){
                mContext=ctx;
                mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);   //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)    
        }
       
        public void open(){  //il database su cui agiamo è leggibile/scrivibile
                mDb=mDbHelper.getWritableDatabase();
               
        }
       
        public void close(){ //chiudiamo il database su cui agiamo
                mDb.close();
        }
       
       
        //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
       // consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento

       
        public void insertProduct(String frase,int tipo){ //metodo per inserire i dati
                ContentValues cv=new ContentValues();
                cv.put(ProductsMetaData.PRODUCT_FRASE_KEY, frase);
                cv.put(ProductsMetaData.PRODUCT_TIPO_KEY, tipo);
                mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, cv);
        }
       
     
       
 
        public Cursor recuperaTutti(){
                        String condizione = "tipo = ?";
                        String [] tipo = {"1"};
                return mDb.query(ProductsMetaData.PRODUCTS_TABLE, null,condizione,tipo,null,null,null);              
        }
       
   
       
       
   

        static class ProductsMetaData {  // i metadati della tabella, accessibili ovunque
                static final String PRODUCTS_TABLE = "frasi";
                static final String ID = "_id";
                static final String PRODUCT_FRASE_KEY = "frase";
                static final String PRODUCT_TIPO_KEY = "tipo";
        }

        private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                        + ProductsMetaData.PRODUCTS_TABLE + " ("
                        + ProductsMetaData.ID+ " integer primary key autoincrement not null, "
                        + ProductsMetaData.PRODUCT_FRASE_KEY + " text not null, "
                        + ProductsMetaData.PRODUCT_TIPO_KEY + " integer not null);";

        private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db

                public DbHelper(Context context, String name, CursorFactory factory,int version) {
                        super(context, name, factory, version);
                }

                @Override
                public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                     
                        LeggiFileAssets.leggiFile(contesto, "query.sql");
                }

                @Override
                public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                        //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione
                }

        }
               

}

dove nell'ultimo onCreate c'è il richiamo per la lettura del file...come recupero i lcontext? con getApplicationContext() eclipse mi segna errore...

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Database e assets
« Risposta #3 il: 12 Agosto 2011, 10:07:37 CEST »
0
senza offesa, ma prima di copiare la classe database l'hai guardata?
nel costruttore ricevi un Context... usa quello!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Database e assets
« Risposta #4 il: 12 Agosto 2011, 10:16:40 CEST »
0
senza offesa, ma prima di copiare la classe database l'hai guardata?
nel costruttore ricevi un Context... usa quello!

ci avevo pensato, ma come faccio ad usare il context del costruttore?

EDIT:
scusa ho risolto...non avevo letto bene, ho usato mContext e ora sembra andare!

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Database e assets
« Risposta #5 il: 12 Agosto 2011, 10:18:56 CEST »
0
ci avevo pensato, ma come faccio ad usare il context del costruttore?
ti copio qualche riga del tuo codice:
Codice (Java): [Seleziona]
public class Database {  

        SQLiteDatabase mDb;
        DbHelper mDbHelper;
        Context mContext;

come lo usi?
------
Database.this.mContext
------
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Database e assets
« Risposta #6 il: 12 Agosto 2011, 10:20:39 CEST »
0
ti copio qualche riga del tuo codice:
Codice (Java): [Seleziona]
public class Database {  

        SQLiteDatabase mDb;
        DbHelper mDbHelper;
        Context mContext;

come lo usi?
------
Database.this.mContext
------

si si grazie, dopo aver postato me ne sono accorto e ho editato :)
Grazie dell'aiuto!

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Database e assets
« Risposta #7 il: 12 Agosto 2011, 10:47:21 CEST »
0
di niente, scusa l'irruenza, però se te lo dicevo subito poi non imparavi!
infatti hai trovato da solo come fare! :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Database e assets
« Risposta #8 il: 12 Agosto 2011, 10:59:28 CEST »
0
di niente, scusa l'irruenza, però se te lo dicevo subito poi non imparavi!
infatti hai trovato da solo come fare! :D

Tranquillo, hai fatto benissimo ;)