Autore Topic: Problema con database  (Letto 1084 volte)

Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Problema con database
« il: 21 Marzo 2012, 11:54:10 CET »
0
ciao a tutti!
apro questo topic anche se ne ho visti altri simile al mio. Il problema è che non riesco a proprio a risolvere da solo.

Volevo importare un database già bello e pronto nella mia applicazione, allora ho provato seguendo questa guida ma non c'è stato verso...

Alla fine, mi sono rassegnato e ho fatto un copia/incolla su questo Problema Db Sqlite - Android Developers Italia già aperto, ma non è cambiato nulla. Ricevo sempre lo stesso errore dall'emulatore.

LogCat
Codice: [Seleziona]
03-21 10:37:07.566: I/Database(713): sqlite returned: error code = 14, msg = cannot open file at source line 25467
03-21 10:37:07.566: E/Database(713): sqlite3_open_v2("/data/data/org.mikesupport.sqlesempioexist/databases/barzellettedb.db", &handle, 1, NULL) failed
03-21 10:37:07.878: D/szipinf(713): Initializing inflate state
03-21 10:37:07.878: D/szipinf(713): Initializing zlib to inflate
In pratica fallisce la copia del database e quindi qualsiasi query faccio dice che le tabelle non esistono.


Allego la classe che gestisce il database, che è la stessa del topic detto in precedenza
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.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLiteDBHelper extends SQLiteOpenHelper {

    private static String DB_PATH = "/data/data/org.mikesupport.sqlesempioexist/databases/";

    private static String DB_NAME = "barzellettedb.db";
   
    private static String ASSETS_DB_FOLDER = "db";
   
    private SQLiteDatabase myDataBase;

    private final Context myContext;

   
    public SQLiteDBHelper(Context context) {
            super(context, DB_NAME, null, 1);
            this.myContext = context;
    }

   
    /**
     * Creates a empty database on the system and overwrite it with your own
     * database.
     **/

    public void createDatabase() throws IOException {
        boolean dbExist = checkDatabase();
            if (!dbExist) {
                    super.getReadableDatabase();
                    try {
                            copyDatabase();
                    }
                    catch (IOException e) {
                            throw new Error("Error copying database");
                    }
            }
    }

    /**
     * Check if the database already exist to avoid re-copying the file each
     * time you open the application.
     *
     * @return true if it exists, false if it doesn't
     */

    private boolean checkDatabase() {
            SQLiteDatabase checkDB = null;

            try {
                    String myPath = DB_PATH + DB_NAME;
                    checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY|SQLiteDatabase.NO_LOCALIZED_COLLATORS);
            }
            catch (SQLiteException e) {
                    // database does't exist yet.
            }

            if (checkDB != null) {
                    checkDB.close();
            }
            return checkDB != null ? true : false;
    }

    private void copyDatabase() throws IOException {
            String[] dbFiles = myContext.getAssets().list(ASSETS_DB_FOLDER);
            String outFileName = DB_PATH + DB_NAME;
            OutputStream myOutput = new FileOutputStream(outFileName);
            for(int i =0; i < dbFiles.length; i++) {
                    InputStream myInput = myContext.getAssets().open(ASSETS_DB_FOLDER+"/"+dbFiles[i]);
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = myInput.read(buffer)) > 0) {
                            myOutput.write(buffer, 0, length);
                    }
                    myInput.close();
            }
            myOutput.flush();
            myOutput.close();
    }

    public void openDatabase() throws SQLException {
            // Open the database
            String myPath = DB_PATH + DB_NAME;
            myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY|SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    }

    @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) { }
   
    @Override
    public synchronized SQLiteDatabase getReadableDatabase (){
            try {
                    createDatabase();
                    openDatabase();
            }
            catch (SQLException e) {
                    myDataBase = null;
                    e.printStackTrace();
            }
            catch (IOException e) {
                    myDataBase = null;
                    e.printStackTrace();
            }
            return myDataBase;
    }
}

Main Activity
Codice (Java): [Seleziona]
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class Main extends Activity implements OnClickListener{
       
        SQLiteDBHelper dbh;
        Button apri;
       
       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        dbh = new SQLiteDBHelper(this);
        try {
                        dbh.createDatabase();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
       
        SQLiteDatabase db = dbh.getReadableDatabase();
       
        apri = (Button) findViewById(R.id.bApri);
        apri.setOnClickListener(this);
        Log.v("speriamo", "se è qui senza errori ok");
    }

sono nelle vostre mani  :-)
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con database
« Risposta #1 il: 21 Marzo 2012, 16:46:58 CET »
0
Incuriosito visto che non ho mai usato ancora i db  ho provato e sembra funzionare tutto o almeno non segnala errore all'apertura del db. Prova sostituendo i tuoi percorsi e una classe più efficiente per la copia del db nella cartella dell'applicazione
Codice (Java): [Seleziona]
            InputStream db = this.getAssets().open("testsqlite");
            File dirdb = new File("/data/data/la.tua.applicazione/databases");
            if (!dirdb.exists()){
                dirdb.mkdir();
            }
            File dbapp=new File("/data/data/la.tua.applicazione/databases/testqlite");
            if (!dbapp.exists()){
               OutputStream out=new FileOutputStream("/data/data/la.tua.applicazione/databases/testsqlite");
               int b;
               while((b=db.read())!=-1){
                    out.write(b);
               }
               out.flush();
               out.close();
               db.close();
         }
SQLiteDatabase myDataBase = SQLiteDatabase.openDatabase("/data/data/la.tua.applicazione/databases/testsqlite", null, SQLiteDatabase.OPEN_READONLY|SQLiteDatabase.NO_LOCALIZED_COLLATORS);
Odio l'inglese e per un informatico non è il massimo

Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:Problema con database
« Risposta #2 il: 21 Marzo 2012, 17:25:12 CET »
0
grazie per il supporto ma ricevo sempre lo stesso errore...

Codice: [Seleziona]
03-21 16:17:59.816: I/Database(1350): sqlite returned: error code = 14, msg = cannot open file at source line 25467
03-21 16:17:59.816: E/Database(1350): sqlite3_open_v2("/data/data/org.mikesupport.sqlesempioexist/databases/barzellettedb", &handle, 1, NULL) failed
03-21 16:17:59.907: D/AndroidRuntime(1350): Shutting down VM
03-21 16:17:59.907: W/dalvikvm(1350): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-21 16:17:59.917: E/AndroidRuntime(1350): FATAL EXCEPTION: main
03-21 16:17:59.917: E/AndroidRuntime(1350): java.lang.Error: Error copying database
03-21 16:17:59.917: E/AndroidRuntime(1350):         at org.mikesupport.sqlesempioexist.SQLiteDBHelper.createDatabase(SQLiteDBHelper.java:59)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at org.mikesupport.sqlesempioexist.Main.onCreate(Main.java:34)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at android.os.Handler.dispatchMessage(Handler.java:99)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at android.os.Looper.loop(Looper.java:130)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at android.app.ActivityThread.main(ActivityThread.java:3683)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at java.lang.reflect.Method.invokeNative(Native Method)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at java.lang.reflect.Method.invoke(Method.java:507)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-21 16:17:59.917: E/AndroidRuntime(1350):         at dalvik.system.NativeStart.main(Native Method)


te hai provato con l'emulatore o un dispositivo?

Allego anche tutto il progetto, dove ci sono 3 classi che gestiscono il db (quella originaria e scritta è HotOrNot, le altre due sono un copia/incolla)
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con database
« Risposta #3 il: 22 Marzo 2012, 00:26:44 CET »
0
Hai verificato il nome? L'errore è proprio sulla copia e tu hai nell'assets il nome barzellettedb.db mentre DBNAME vale barzellettedb
Odio l'inglese e per un informatico non è il massimo

Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:Problema con database
« Risposta #4 il: 22 Marzo 2012, 10:20:24 CET »
0
Hai verificato il nome? L'errore è proprio sulla copia e tu hai nell'assets il nome barzellettedb.db mentre DBNAME vale barzellettedb

quella è stata una prova, passare il database senza estensione; nel primo logCat postato l'estensione c'era.

Comunque inizio ad innervosirmi, non sò più che altro fare..  o_O

Alla fine credo che faro un file txt o csv e importo quello al primo avvio...

grazie comunque
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)

Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:Problema con database
« Risposta #5 il: 22 Marzo 2012, 11:52:40 CET »
0
Comunque ora ho modificato il metodo checkDatabase così

Codice (Java): [Seleziona]
private boolean checkDatabase() {
        File database = myContext.getApplicationContext().getDatabasePath(DB_NAME);
        return database.exists();
    }
e il classico errore
Codice: [Seleziona]
sqlite3_open_v2("/data/data/org.mikesupport.sqlesempioexist/databases/barzellettedb", &handle, 1, NULL) failed
non viene più fuori. Solo che poi la copia del database non avviene, infatti le query restituiscono sempre lo stesso errore, cioè che le tabelle non esistono...
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)