Autore Topic: Caricamento Database già esistente  (Letto 1701 volte)

Offline UnholySpirit

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Windows 7
Caricamento Database già esistente
« il: 02 Giugno 2012, 10:42:32 CEST »
0
Salve a tutti, volevo chiedere gentilmente se qualcuno ha già giocato un po' con i database SQLite e se può aiutarmi a risolvere questo problema.
Io ho un db SQLite fatto da PC con sqlitebrowser, vorrei portarlo su android, aprirlo e leggerlo.
Ho quindi preso il database, spostato nella cartella assets e creato questa classe:

Codice: [Seleziona]
public class DatabaseBridge {
        private static SQLiteDatabase database = null;
        private static final String DB_PATH = "/data/data/***/databases/Database.db";
       
        private static void loadDatabase()
        {
                if(database == null)
                {
                        File dbFile = new File(DB_PATH);
                        database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
                }
        }

        public static void loadCities()
        {
                loadDatabase();
                if(database.isOpen())
                        DataBridge.setCities(new String[]{"APERTO"});
                else
                        DataBridge.setCities(new String[]{"CHIUSO"});
        }

Quando richiamo il metodo:

Codice: [Seleziona]
06-02 10:33:03.383: E/AndroidRuntime(16568): FATAL EXCEPTION: main
06-02 10:33:03.383: E/AndroidRuntime(16568): java.lang.RuntimeException: Unable to start activity ComponentInfo{***/***.LocalizeActivity}: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.os.Looper.loop(Looper.java:137)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.app.ActivityThread.main(ActivityThread.java:4424)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at java.lang.reflect.Method.invokeNative(Native Method)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at java.lang.reflect.Method.invoke(Method.java:511)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at dalvik.system.NativeStart.main(Native Method)
06-02 10:33:03.383: E/AndroidRuntime(16568): Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1013)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1043)
06-02 10:33:03.383: E/AndroidRuntime(16568):         at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1036)

Evidentemente non trova il database però non so come altro fare..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Caricamento Database già esistente
« Risposta #1 il: 02 Giugno 2012, 11:02:40 CEST »
0
Non hai specificato come effettivamente carichi il db. Inizialmente lo metti nella cartella assets e poi lo copi? Hai verificato che il db il quel path effettivamente esiste?

Offline UnholySpirit

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Windows 7
Re:Caricamento Database già esistente
« Risposta #2 il: 02 Giugno 2012, 11:07:12 CEST »
0
Se lo metto nella cartella assets non si copia da solo? Perché ho seguito varie guide ma nessuna spiega questa cosa chiaramente.
Allegato.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Caricamento Database già esistente
« Risposta #3 il: 02 Giugno 2012, 11:18:11 CEST »
0
Se lo metto nella cartella assets non si copia da solo? Perché ho seguito varie guide ma nessuna spiega questa cosa chiaramente.
Allegato.

No, devi copiarlo tu da codice.
Se googli un pochino dovresti trovare del codice già fatto ;)

Offline UnholySpirit

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Windows 7
Re:Caricamento Database già esistente
« Risposta #4 il: 02 Giugno 2012, 11:20:27 CEST »
0
No, devi copiarlo tu da codice.
Se googli un pochino dovresti trovare del codice già fatto ;)
Ho trovato tre tutorial per questa cosa ma nessuno funziona decentemente quindi cerco di andare avanti provando.
Comunque basterebbe copiare il db da assets a /data/data/pkg_name/databases/Database.db e poi il codice funziona?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Caricamento Database già esistente
« Risposta #5 il: 02 Giugno 2012, 11:24:03 CEST »
0
Ho trovato tre tutorial per questa cosa ma nessuno funziona decentemente quindi cerco di andare avanti provando.
Comunque basterebbe copiare il db da assets a /data/data/pkg_name/databases/Database.db e poi il codice funziona?

Si, ovviamente devi impostare il tutto in modo tale che venga copiato solo se non esiste e magari studiarti un piccolo sistema per gestire un eventuale update del database (meglio pararsi il di dietro per certe situazioni).
Buon lavoro! ;)

Offline UnholySpirit

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Windows 7
Re:Caricamento Database già esistente
« Risposta #6 il: 02 Giugno 2012, 11:41:43 CEST »
0
Codice: [Seleziona]
public class DatabaseBridge {
        private static SQLiteDatabase database = null;
        private static final String DB_PATH = "/data/data/org.***.***/databases/";
        private static final String DB_NAME = "Database.db";
       
        public static void loadDatabase(AssetManager assetManager)
        {
                if(database == null)
                {
                        try
                        {
                                InputStream in = assetManager.open(DB_NAME);
                                OutputStream out = new FileOutputStream(DB_PATH + DB_NAME);
                                copyFile(in, out);
                                in.close();
                                out.flush();
                                out.close();
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                        File dbFile = new File(DB_PATH + DB_NAME);
                        database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
                }
        }
       
        private static void copyFile(InputStream in, OutputStream out) throws IOException
        {
                byte[] buffer = new byte[1024];
            int read;
            while((read = in.read(buffer)) != -1)
                    out.write(buffer, 0, read);
        }
Ho copiato il database però non vuole aprirsi lo stesso.

Ok, ho provato a caricarlo da sdcard e funziona.
Però l'ho caricato manualmente e vorrei includerlo nell'apk..

Ok, sono riuscito anche a includerlo nell'apk. L'unico problema è che non riesco ad accedere a /data/data/pkgname/databases ma l'unica maniera che ho per accedere è creare l'albero delle directory sulla sdcard.
« Ultima modifica: 02 Giugno 2012, 13:25:32 CEST da UnholySpirit »