2010-06-10 7 views
6

Meine Frage ist, denke ich, ziemlich einfach, aber ich denke nicht, dass die Antwort sein wird ... Ich habe ziemlich viel Inhalt in meiner Anwendung zu haben um es richtig laufen zu lassen, und ich denke, alles in eine Datenbank zu setzen, und verteilt es in einer eingebetteten Datenbank mit der Anwendung auf dem Markt. Das einzige Problem ist, dass ich keine Ahnung habe, wie das geht. Ich weiß, dass ich eine Datei .db von Eclipse DDMS mit dem Inhalt meiner Datenbank extrahieren kann, und ich nehme an, ich muss es in den Asset-Ordner meiner Anwendung legen, aber dann wie die Anwendung es verwenden, um die Anwendung neu zu generieren Datenbank? Wenn Sie einen Link zu Code oder Hilfe haben, wäre das großartig. DankBetten Sie eine Datenbank in die .apk einer verteilten Anwendung ein [Android]

Antwort

12

Gut zu erreichen, was Sie fragen, könnten Sie die Db-Datei in Ihr Vermögen/Verzeichnis abgelegt und kopieren Sie sie in Position das erste Mal, wenn Sie Ihre Anwendung starten .....

final String DB_DESTINATION = "/data/data/YOUR_PACKAGE_NAME/databases/MyDatabaseFile.db"; 

// Check if the database exists before copying 
boolean initialiseDatabase = (new File(DB_DESTINATION)).exists(); 
if (initialiseDatabase == false) { 

    // Open the .db file in your assets directory 
    InputStream is = getContext().getAssets().open("MyDatabaseFile.db"); 

    // Copy the database into the destination 
    OutputStream os = new FileOutputStream(DB_DESTINATION); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = is.read(buffer)) > 0){ 
     os.write(buffer, 0, length); 
    } 
    os.flush(); 

    os.close(); 
    is.close(); 
} 

Wobei "initialiseDatabase" ein Flag ist, das angibt, ob die App zum ersten Mal gestartet wurde.

Obwohl, wenn Sie viele Daten speichern möchten, wie Sie erwähnten: Ich empfehle dringend, vermeiden Sie die APK-Datei damit aufgebläht, und verwenden Sie die Internetverbindung, um die Datenbank Datensätze (von einem gehosteten Server) nach Die App wurde gestartet. Auf diese Weise können Sie einen Fortschrittsbalken anzeigen, der dem Benutzer anzeigt, warum er lange auf die Verwendung der App wartet. Wenn APK besonders groß gemacht wird, werden die Leute normalerweise davon abgehalten, es zu installieren.

+0

Nun, ich habe einen Fortschrittsbalken vor, aber wie ich viele Bilder herunterladen und mehrere XML-Parsing es dauert ziemlich viel Zeit, besonders wenn Sie das 3G-Netzwerk anstelle von WLAN verwenden – Sephy

+0

wäre es nicht einfacher zu überprüfen, ob die Datenbank bereits vorhanden ist, anstatt den booleschen Wert zu verwenden? Wie kann ich den Booleschen Wert verfolgen, wenn die Anwendung heruntergefahren wird? Eintrag in der DB? – Sephy

+0

Das ist genau das, was der Boolean darstellt, ich habe das als eine Implementierungsaufgabe verlassen. Ich habe den Beispielcode mit der Vorgehensweise aktualisiert. – seanhodges

1

Sie können eine mittlere Lösung implementieren: Verwenden Sie den obigen Ansatz, aber anstatt die db-Datei zu verteilen, legen Sie sie irgendwo auf dem Server ab. Meiner Erfahrung nach Dateien zu bekommen ist nur 10% der Bearbeitungszeit, der Rest ist das Parsen und Serialisieren von Bildern zu db

+0

Eigentlich war mein Zweck, es zu vermeiden, es auf einen Server zu setzen und einen Download direkt nach der Installation der Anwendung zu erzwingen ... – Sephy

+0

Ich verstehe. Ich habe es für meine App in Erwägung gezogen, aber dann habe ich db size und seine weitere + 350K angesehen. Die Leute wurden empfindlich, aber wenn Sie eine anständige Verbindung haben, ist es definitiv schneller als ein stückweises Herunterladen mit anschließender Verarbeitung – Bostone