Autore Topic: Mio Database  (Letto 1187 volte)

Offline Michele77

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc desire hd
  • Sistema operativo:
    windows
Mio Database
« il: 10 Aprile 2013, 15:25:11 CEST »
0
Salve, lo so che l'argomento e' stato trattato più volte (ho letto tutte le guide-tutorial) ma non riesco a venirne fuori.
Allora, ricapitolando ho la mia applicazione android e vorrei utilizzare il mio database sqlite (Nomedb=Turno).
La App dovrebbe solo leggere i record del db (magari con una textbox) e bottone cerca.
Allora , copio il file Turno nella cartella asset, creo la Classe DatabaseHelperJava  (me la correggete?) e qui mi fermo...non riesco ad andare avanti. Mi date una mano?
Codice (Java): [Seleziona]
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
 
public class DataBaseHelper extends SQLiteOpenHelper
{
private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window
//destination path (location) of our database on device
private static String DB_PATH = "";
private static String DB_NAME ="Tuno";// Database name
private SQLiteDatabase mDataBase;  
private final Context mContext;
 
@SuppressLint("SdCardPath")
public DataBaseHelper(Context context)  
{
    super(context, DB_NAME, null, 1);// 1? its Database Version
    DB_PATH = "/sdcard/data" + context.getPackageName() + "/databases/";
    this.mContext = context;
}    
 
public void createDataBase() throws IOException
{
    //If database not exists copy it from the assets
 
    boolean mDataBaseExist = checkDataBase();
    if(!mDataBaseExist)
    {
        this.getReadableDatabase();
        this.close();
        try  
        {
            //Copy the database from assets
            copyDataBase();
            Log.e(TAG, "createDatabase database created");
        }  
        catch (IOException mIOException)  
        {
            throw new Error("ErrorCopyingDataBase");
        }
    }
}
    //Check that the database exists here: /data/data/your package/databases/Db_Name
    private boolean checkDataBase()
    {
        File dbFile = new File(DB_PATH + DB_NAME);
        //Log.v("dbFile", dbFile + "   "+ dbFile.exists());
        return dbFile.exists();
    }
 
    //Copy the database from assets
    private void copyDataBase() throws IOException
    {
        InputStream mInput = mContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream mOutput = new FileOutputStream(outFileName);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer))>0)
        {
            mOutput.write(mBuffer, 0, mLength);
        }
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }
 
    //Open the database, so we can query it
    public boolean openDataBase() throws SQLException
    {
        String mPath = DB_PATH + DB_NAME;
        //Log.v("mPath", mPath);
        mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        return mDataBase != null;
    }
 
    @Override
    public synchronized void close()  
    {
        if(mDataBase != null)
            mDataBase.close();
        super.close();
    }

        @Override
        public void onCreate(SQLiteDatabase arg0) {
                // TODO Auto-generated method stub
               
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // TODO Auto-generated method stub
               
        }
 
}

 
« Ultima modifica: 10 Aprile 2013, 15:28:11 CEST da Michele77 »

Offline Eu4ia

  • Utente junior
  • **
  • Post: 93
  • Respect: +16
    • Mostra profilo
  • Play Store ID:
    Eu4ia
  • Sistema operativo:
    Ubuntu 11.10 + Windows 7
Re:Mio Database
« Risposta #1 il: 10 Aprile 2013, 15:28:08 CEST »
+1
Intanto a colpo d'occhio, stai attento a:

Codice (Java): [Seleziona]
private static String DB_NAME ="Tuno";// Database name
manca una "R" in TURNO   ;-)
Se ti sono stato utile premi "Thanks" ;-)

Offline Michele77

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc desire hd
  • Sistema operativo:
    windows
Re:Mio Database
« Risposta #2 il: 10 Aprile 2013, 15:34:12 CEST »
0
Grazie mille, sistemato l'errore di battitura ma avrei 2 domande:
1)E' corretto lasciare questa stringa vuota?
Codice (Java): [Seleziona]
private static String DB_PATH = "";
2)Perché il log cat e' vuoto? Non succede niente...dove dovrei trovare la copia del db?

Offline Eu4ia

  • Utente junior
  • **
  • Post: 93
  • Respect: +16
    • Mostra profilo
  • Play Store ID:
    Eu4ia
  • Sistema operativo:
    Ubuntu 11.10 + Windows 7
Re:Mio Database
« Risposta #3 il: 10 Aprile 2013, 15:48:53 CEST »
+1
Ciao, io darei un'occhiata a questi post:
http://www.anddev.it/index.php?topic=7623.0

http://www.androidiani.com/forum/programmazione-e-hint-avanzati/117685-eclipse-copia-db-sqlite-preesistente-da-assets-data-data.html

Grazie mille, sistemato l'errore di battitura ma avrei 2 domande:
1)E' corretto lasciare questa stringa vuota?
Codice (Java): [Seleziona]
private static String DB_PATH = "";
2)Perché il log cat e' vuoto? Non succede niente...dove dovrei trovare la copia del db?

1) Si è normale perchè poi lo imposti con:
Codice (Java): [Seleziona]
DB_PATH = "/sdcard/data" + context.getPackageName() + "/databases/";
2) Il Logcat è vuoto perchè non fai nessun log in fase di copia. Se alla fine del metodo copyDatabase aggiungessi ad esempio:
Codice (Java): [Seleziona]
Log.v("dbFile", "dbFile COPIED");
Dovresti vederlo una volta terminata la copia del db.

Il db lo trovi nella vista DDMS in eclipse, nella cartella data/data/TUOPACKAGE/databases se testi con emulatore.
Se testi con device fisico invece non potresti vederlo da DDMS, solo se il telefono è rooted.
« Ultima modifica: 10 Aprile 2013, 15:50:37 CEST da Eu4ia »
Se ti sono stato utile premi "Thanks" ;-)

Offline Michele77

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc desire hd
  • Sistema operativo:
    windows
Re:Mio Database
« Risposta #4 il: 10 Aprile 2013, 16:15:51 CEST »
0
Scusami ma, non copia niente:-(
Inoltre il log non dovrebbe essere scritto da questo codice?
Codice (Java): [Seleziona]
//Copy the database from assets
            copyDataBase();
            Log.e(TAG, "createDatabase database created");

Forse ho sbagliato anche qui?
Codice (Java): [Seleziona]
@SuppressLint("SdCardPath")
public DataBaseHelper(Context context)  
{
    super(context, DB_NAME, null, 1);// 1? its Database Version
    DB_PATH = "/data/data" + context.getPackageName() + "/databases/";
    this.mContext = context;
}    


Offline Eu4ia

  • Utente junior
  • **
  • Post: 93
  • Respect: +16
    • Mostra profilo
  • Play Store ID:
    Eu4ia
  • Sistema operativo:
    Ubuntu 11.10 + Windows 7
Re:Mio Database
« Risposta #5 il: 10 Aprile 2013, 16:28:33 CEST »
+1
Si scusa mi correggo:

Codice (Java): [Seleziona]
Log.v(TAG, "createDatabase database created");Per verbose
Codice (Java): [Seleziona]
Log.i(TAG, "createDatabase database created");Per Information

Il path dovrebbe essere:

Codice (Java): [Seleziona]
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";Ti manca un "/" dopo "data"

Mi viene poi un dubbio, quanto è grande il db? supera 1MB?
Sei sicuro poi che il file non ha estensione? Se ce l'ha va messa in DB_NAME.
« Ultima modifica: 10 Aprile 2013, 16:31:56 CEST da Eu4ia »
Se ti sono stato utile premi "Thanks" ;-)

Offline Michele77

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc desire hd
  • Sistema operativo:
    windows
Re:Mio Database
« Risposta #6 il: 10 Aprile 2013, 16:33:24 CEST »
0
No, il DB e' solo di 93K e nella cartella package ho solo un'altra cartella, Lib.
Per favore mi correggi  questo codice?
« Ultima modifica: 10 Aprile 2013, 16:40:51 CEST da Michele77 »

Offline Eu4ia

  • Utente junior
  • **
  • Post: 93
  • Respect: +16
    • Mostra profilo
  • Play Store ID:
    Eu4ia
  • Sistema operativo:
    Ubuntu 11.10 + Windows 7
Re:Mio Database
« Risposta #7 il: 10 Aprile 2013, 17:10:59 CEST »
+1
Allora il tuo progetto dovrà avere una cartella src con all'interno il tuo package.
La cartella lib non so cosa sia, al max esiste libs ma è al di fuori di src.
Il file del db (che non deve superare 1MB) va messo nella cartella assets al di fuori di src.


Codice (Java): [Seleziona]
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
 
public class DatabaseHelper extends SQLiteOpenHelper{
 
    String DB_PATH =null;
 
    private static String DB_NAME = "Turno"; // sei sicuro che sia senza estensione?
 
    private SQLiteDatabase myDataBase;
 
    private final Context myContext;
 
    public DatabaseHelper(Context context) {
 
        super(context, DB_NAME, null, 1);
        this.myContext = context;
        DB_PATH="/data/data/"+context.getPackageName()+"/"+"databases/";
    }  
 
  /**
     * Crea un db vuoto in DB_PATH pronto per essere sovrascritto con quello in assets
     * */

    public void createDataBase() throws IOException{
 
        boolean dbExist = checkDataBase();
 
        if(dbExist){
            //non fare nulla il db esiste già
        }else{
 
            this.getReadableDatabase();
 
            try {
 
                copyDataBase();
 
            } catch (IOException e) {
 
                throw new Error("Errore in fase di copia del DB");
 
            }
        }
 
    }
 
    /**
     * Controlla se il DB esiste già per evitare la copia ad ogni avvio
     * VERO = DB esiste
     * FALSO = DB non esiste
     */

    private boolean checkDataBase(){
 
        SQLiteDatabase checkDB = null;
 
        try{
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 
        }catch(SQLiteException e){
 
            //il DB non esiste ancora
 
        }
 
        if(checkDB != null){
 
            checkDB.close();
 
        }
 
        return checkDB != null ? true : false;
    }
 
    /**
     * Copia il db dalla cartella assets in quello appena creato come vuoto
     * */

    private void copyDataBase() throws IOException{
 
        //Apre il db in assets
        InputStream myInput = myContext.getAssets().open(DB_NAME);
 
        // Percorso del file del db VUOTO
        String outFileName = DB_PATH + DB_NAME;
 
        // Apre il db vuoto
        OutputStream myOutput = new FileOutputStream(outFileName);
 
        // Trasferisco byte x bytes da inputfile a outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }
 
        myOutput.flush();
        myOutput.close();
        myInput.close();
 
    }
 
    public void openDataBase() throws SQLException{
 
        // Apro il db
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 
    }
 
    @Override
    public synchronized void close() {
 
            if(myDataBase != null)
                myDataBase.close();
 
            super.close();
 
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
 
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
 //return cursor
    public Cursor query(String table,String[] columns, String selection,String[] selectionArgs,String groupBy,String having,String orderBy){
        return myDataBase.query("EMP_TABLE", null, null, null, null, null, null);
 
    }
}



Nell'attività principale invece dovrai scrivere:



Codice (Java): [Seleziona]
DatabaseHelper myDbHelper = new DatabaseHelper(CopyDbActivity.this);
      try {
            myDbHelper.createDataBase();

            } catch (IOException ioe) {
                throw new Error("Impossibile creare il database");
            }

            try {
                myDbHelper.openDataBase();
            }catch(SQLException sqle){
                throw sqle;
            }
            Toast.makeText(ActivityPRINCIPALE.this, "FINITO CON SUCCESSO!", Toast.LENGTH_SHORT).show();

Così dovrebbe funzionare.
Se ti sono stato utile premi "Thanks" ;-)

Offline Michele77

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc desire hd
  • Sistema operativo:
    windows
Re:Mio Database
« Risposta #8 il: 10 Aprile 2013, 17:19:15 CEST »
0
e nella classe CopyDbActivity cosa ci devo mettere?
Potresti inviarmi un progetto completo?

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:Mio Database
« Risposta #9 il: 10 Aprile 2013, 17:27:45 CEST »
0
e nella classe CopyDbActivity cosa ci devo mettere?
Potresti inviarmi un progetto completo?
non puoi chiedere correzioni ad hoc e progetti completi, però puoi seguire i tutorial e capire tu stesso come fare le cose:
[medio] Creazione e utilizzo di un database SQLite - Android Developers Italia
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 Eu4ia

  • Utente junior
  • **
  • Post: 93
  • Respect: +16
    • Mostra profilo
  • Play Store ID:
    Eu4ia
  • Sistema operativo:
    Ubuntu 11.10 + Windows 7
Re:Mio Database
« Risposta #10 il: 10 Aprile 2013, 17:30:27 CEST »
+1
Correggo CopyDBActivity.this => ActivityPrincipale.this
Ti torna?

Prova con questo:
http://mobisys.in/android-samples/External%20Db%202%20Application.zip
Se ti sono stato utile premi "Thanks" ;-)

Offline Michele77

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc desire hd
  • Sistema operativo:
    windows
Re:Mio Database
« Risposta #11 il: 10 Aprile 2013, 18:23:23 CEST »
0
OK grazie provo.

Offline Eu4ia

  • Utente junior
  • **
  • Post: 93
  • Respect: +16
    • Mostra profilo
  • Play Store ID:
    Eu4ia
  • Sistema operativo:
    Ubuntu 11.10 + Windows 7
Re:Mio Database
« Risposta #12 il: 11 Aprile 2013, 11:52:30 CEST »
0
Come procede, sei riuscito?
Se ti sono stato utile premi "Thanks" ;-)

Offline Michele77

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc desire hd
  • Sistema operativo:
    windows
Re:Mio Database
« Risposta #13 il: 11 Aprile 2013, 12:29:34 CEST »
0
Ciao, purtroppo ancora no ;')
ho inserito la classe CopyDbActivity
Codice (Java): [Seleziona]
public class CopyDbActivity extends Activity {
    /** Called when the activity is first created. */
        Cursor c=null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        ((Button)findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener(){
                        @Override
                        public void onClick(View v) {
                               
                         
                         DatabaseHelper myDbHelper = new DatabaseHelper(CopyDbActivity.this);
                         try {
                 
                                myDbHelper.createDataBase();
                 
                        } catch (IOException ioe) {
                 
                                throw new Error("IMPOSSIBILE CREARE database");
                 
                        }
                 
                        try {
                 
                                myDbHelper.openDataBase();
                 
                        }catch(SQLException sqle){
                 
                                throw sqle;
                 
                        }
                        Toast.makeText(CopyDbActivity.this, "Success", Toast.LENGTH_SHORT).show();
                 
                       
                        }
                });
       
               
       
    }
}
ma quando esegue la app va in crash

Offline Eu4ia

  • Utente junior
  • **
  • Post: 93
  • Respect: +16
    • Mostra profilo
  • Play Store ID:
    Eu4ia
  • Sistema operativo:
    Ubuntu 11.10 + Windows 7
Re:Mio Database
« Risposta #14 il: 11 Aprile 2013, 12:34:54 CEST »
0
Ok perchè non posti il logcat così ci capiamo meglio?
Se ti sono stato utile premi "Thanks" ;-)