2009-06-28 16 views
32

Ho già scoperto che non c'è modo di raggruppare i file in un .apk e averli su/sdcard, l'opzione migliore finora è quella di scaricare i file di grandi dimensioni al primo avvio. Mi sono imbattuto in un tutorial che diceva come raggruppare un db sqlite con l'apk e quindi copiarlo in modo che fosse possibile accedervi con SQLiteDatabase (raddoppiando quindi lo spazio necessario e non utilizzando affatto/sdcard).Posso scaricare una SQL db on/sdcard e accedervi dalla mia app per Android?

http://developer.android.com/guide/topics/data/data-storage.html#db dice che tutti i database DEVONO essere in/data/data/nome_pacchetto/database.

È davvero così? C'è un modo per ingannare il framework nell'apertura di un database che si trova sulla partizione di/sdcard? C'è un modo per usare un altro java wrapper/framework SQLite per accedere a tali database?

Se la risposta a quanto sopra è "No", quali altre opzioni ho? I miei dati sono molto ben rappresentati in un modello relazionale, ma sono troppo grandi, inoltre, voglio essere in grado di aggiornarlo senza la necessità di reinstallare/aggiornare l'intera app.

+1

Lei ha parlato di "Io mai incontrato un tutorial dire come impacchettare un db sqlite con l'apk e poi copiarlo ..". Hai un puntatore a questa risorsa? – Ichorus

+1

@Ichorus - Penso che questo sia ciò a cui potrebbe riferirsi - http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ –

risposta

44

Certo che puoi. I documenti sono un po 'contrastanti riguardo a questo, come dicono anche che non sono imposte limitazioni. Penso che dovrebbero dire che i percorsi relativi si trovano nella posizione sopra e che i dbs sono privati. Qui è il codice che si desidera:

File dbfile = new File("/sdcard/mydb.sqlite"); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
System.out.println("Its open? " + db.isOpen()); 
+2

Quindi possiamo accedere a quel database file da tutte le attività in out application ??? Non ero in grado di farlo in modo convenzionale !! –

+1

Grazie Adam. E non dimenticare di aggiungere questa autorizzazione: nel tuo AndroidManifest.xml –

+0

@Ashik: non vedo perché tu possa ' t accedervi nelle altre attività. Abbiamo molte opzioni: trasferire l'oggetto db SQLiteDatabase aperto sull'attività richiesta o archiviare l'oggetto db in un riferimento statico. Questo dovrebbe coprirlo. –

1

Solo un'idea:

  • si può mettere il database.db nella cartella asset.

  • se il file database.db è più grande di 2Mb il sistema è in grado di comprimere, quindi è necessario altro opzioni

  • è possibile rinominare i database.db ad esempio database.jit o database.mp3 - che non sono compressi, rispetto alla prima esecuzione è possibile rinominarla a database.db

7

Prova questa:

String dir = Environment.getExternalStorageDirectory().getPath() 
File dbfile = new File(dir+"/mydb.sqlite"); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
System.out.println("Its open? " + db.isOpen()); 
1

condivido codice successivo. Dichiara opcionesMenu Vector<String>

Vector <String> opcionesMenu = new Vector<String>(); 
// the database is SDCard. I saw the code to Blackberry (net.rim) 
String rutaDB = "/storage/extSdCard/Android/databases/Offshore.db"; 


    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(rutaDB, null); 

    Cursor cursor = db.rawQuery("SELECT Codigo, Nombre FROM Ruta ORDER BY Codigo, Nombre", null); 

    if (cursor.moveToFirst()) 
    { 
     do 
     { 
      opcionesMenu.add(cursor.getString(0) + " - " + cursor.getString(1)); 
     } while(cursor.moveToNext()); 
    } 

    db.close(); 
Problemi correlati