2012-10-04 14 views
11

Desidero utilizzare un database "pre caricato" nella mia app. Ci sono un sacco di domande su questo e più punti a questo articolo del blog here o simili.Ottieni la directory dei database per la mia app in modo programmatico

Fin qui tutto bene. Voglio solo sapere se c'è un modo migliore per ottenere la directory di database predefiniti in modo da non dover usare qualcosa di simile:

private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/"; 

Voglio dire, forse, che viene modificato in futuro o forse un dispositivo o rom potrebbe metterlo altrove ... quindi c'è un modo per ottenere questo percorso programmaticamente?

In Context esiste un metodo per getDatabasePath (nome), ma è necessario dare un nome db esistente e ben ... che non esiste ancora, voglio spostare lì: P

+0

http://stackoverflow.com/questions/9109438/how-to-use-an-existing-database-with-an-android- application/9109728 # 9109728 –

risposta

6

Creare un DB vuoto, ottenere il percorso con getDatabasePath(), poi sovrascrivere con il vostro.

+1

Lo stavo già facendo ... ma suona come un trucco: D Ma beh ... sicuramente funziona. –

+4

Bene, dal momento che non esiste un'API ufficiale per importare un file DB già pronto, mettendo il tuo file c'è anche un trucco. Almeno ti stai accertando di metterlo nel posto giusto. –

+0

Ho bisogno di un permesso di scrittura per questo? – Simon

6

È è possibile utilizzare il metodo getFilesDir() o getDatabasePath in una classe di attività per ottenere questa cartella.
Maggiori informazioni here

10

ho usato ...

String destPath = getFilesDir().getPath(); 
destPath = destPath.substring(0, destPath.lastIndexOf("/")) + "/databases"; 
+1

Cosa succede se la cartella cambia in una versione futura? – pablisco

7

Utilizzato da SQLiteAssetHelper:

String path = mContext.getDatabasePath(mName).getPath(); 

In questo momento, il database non esiste. Penso che String prenda solo il percorso interno e aggiunga i modificatori appropriati. In realtà, questo sembra funzionare bene:

context.getDatabasePath("a").getParentFile() 

Fondamentalmente, non c'è bisogno di avere un vero e proprio database creato, basta chiedere per uno.

+2

La directory del database potrebbe non esistere quindi prima di scrivere/copiare qualsiasi contenuto in context.getDatabasePath ("a") assicurarsi di verificare che context.getDatabasePath ("a"). GetParentFile() esista e se non crei la directory. – nibarius

1

È possibile utilizzare il metodo getDatabasePath nella classe Helper:

public class MyDatabase extends SQLiteAssetHelper { 

    private static final String DATABASE_NAME = "wl.db"; 
    private static final int DATABASE_VERSION = 1; 
    public String databasePath = "";  

    public MyDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

     // you can use an alternate constructor to specify a database location 
     // (such as a folder on the sd card) 
     // you must ensure that this folder is available and you have permission 
     // to write to it 
     // super(context, DATABASE_NAME, context.getExternalFilesDir(null).getAbsolutePath(), null, DATABASE_VERSION); 

     databasePath = context.getDatabasePath("wl.db").getPath(); 
    } 
Problemi correlati