2012-10-04 4 views
11

Ich möchte eine "vorinstallierte" Datenbank in meiner App verwenden. Es gibt Unmengen von Fragen dazu und die meisten zeigen auf diesen Blog-Artikel here oder ähnliches.Datenbankverzeichnis für meine App programmgesteuert abrufen

So weit so gut. Ich will nur wissen, ob es ein besserer Weg, um das Standard-Datenbankverzeichnis zu erhalten, so müssen Sie so etwas wie diese nicht verwenden:

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

ich meine, vielleicht, dass in der Zukunft oder vielleicht ein Gerät geändert wird oder rom könnte es anderswo platzieren ... Gibt es also einen Weg, diesen Pfad programmatisch zu bekommen?

im Kontext existiert, ein Verfahren zum getDatabasePath (Name), aber Sie müssen es einen vorhandenen db Namen geben und gut ... es existiert noch nicht, ich will es, ihn bewegen: P

+0

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

Antwort

6

einen leeren DB erstellen, mit getDatabasePath() den Weg bekommen, überschreiben sie dann mit Ihrem eigenen.

+1

Ich habe das schon gemacht ... klingt aber wie ein Hack: D Aber naja ... es funktioniert schon. –

+4

Nun, da es keine offizielle API zum Importieren einer vorgefertigten DB-Datei gibt, ist es auch ein Hack, wenn Sie Ihre eigene Datei dort ablegen. Zumindest stellen Sie sicher, dass Sie es an die richtige Stelle setzen. –

+0

Benötige ich dafür eine Schreibberechtigung? – Simon

6

Sie kann die Methode getFilesDir() oder getDatabasePath in einer Aktivitätsklasse verwenden, um diesen Ordner zu erhalten.
Mehr Infos here

10

habe ich ...

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

Was passiert, wenn sich der Ordner in einer zukünftigen Version ändert? – pablisco

7

von SQLiteAssetHelper Gebraucht:

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

Zu diesem Zeitpunkt gibt es die Datenbank nicht. Ich denke, der String nimmt nur den internen Pfad und fügt die entsprechenden Modifikatoren hinzu. In der Tat scheint dies gut zu funktionieren:

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

Grundsätzlich Sie keine echte Datenbank erstellt, fragen Sie einfach es für eine haben müssen.

+2

Das Datenbankverzeichnis ist möglicherweise nicht vorhanden, also bevor Sie irgendeinen Inhalt in context.getDatabasePath ("a") schreiben/kopieren, stellen Sie sicher, dass context.getDatabasePath ("a"). GetParentFile() existiert und wenn nicht, erstellen Sie das Verzeichnis. – nibarius

1

Sie können getDatabasePath Methode in der Helper-Klasse verwenden:

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(); 
    }