/ / SQLite-Datenbank auf SD-Karte - Android, SQLite, Android-SD-Karte

SQLite-Datenbank auf SD-Karte - Android, SQLite, Android-SD-Karte

Ich möchte eine SQLite-Datenbank auf der SD-Karte erstellen (ich möchte nicht den internen Speicher des Benutzers belegen). Ich bin mit dem OpenHelper-Muster vertraut:

public DatabaseFoo(Context context) {
OpenHelper openHelper = new OpenHelper(context);
mDb = openHelper.getWritableDatabase();
}

private static class OpenHelper extends SQLiteOpenHelper {
public OpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

...

Wenn wir also auf der SD-Karte erstellen möchten, müssen wir meines Erachtens stattdessen Folgendes verwenden:

public static SQLiteDatabase openOrCreateDatabase (String path,
SQLiteDatabase.CursorFactory factory);

Aber was soll das Argument "Fabrik" sein, welche Fabrik soll verwendet werden?

Auch ein bisschen besorgt darüber, was passiert, wenn der Benutzer die SD-Karte entfernt, während meine App verwendet wird.

Vielen Dank

Antworten:

9 für die Antwort № 1

Ich habe nicht versucht zu tun, was Sie dort beschreiben,aber vermutlich könnte es geschehen und funktionieren - mit ein paar Einschränkungen. Erstens ist der externe Speicher (SD-Karte) nicht sicher, sodass jede andere Anwendung oder der Benutzer darauf lesen / schreiben kann. Zweitens verschwindet die DB, wenn sie abgehängt ist.

Wegen dieser Nachteile würden SieEs ist wahrscheinlich besser, wenn Sie versuchen, eine interne Speicherdatenbank (die Standarddatenbank) zu verwenden, die klein ist und möglicherweise Verweise auf externe Daten (wie Bilder oder Dateien) enthält - die sich auf dem externen Speicher befinden können (und Platzhalter haben) oder andere Behandlung, wenn der externe Speicher nicht verfügbar ist).

Wenn Sie es dennoch versuchen möchten, ist es möglicherweise besser, die Option zu überschreiben getDatabasePath Methode von Kontext, wie mit deinem eigenen Anwendung Objekt und dann übergeben Das in eine regelmäßige SQLiteOpenHelper. Dann brauchen Sie sich keine Gedanken über die Cursor-Fabrik zu machen (was optional ist, wie die Quelle bestätigt - Übergeben Sie einfach null, wenn Sie stattdessen diesen Weg gehen möchten.


9 für die Antwort № 2

Führen Sie dies in Ihrem SQLiteOpenHelper-Konstruktor aus:

DatabaseHelper(Context context) {
super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION);
}

Die Datenbank wird im Ordner der App erstelltauf der SD-Karte: / SD-Karte / Android / data / [Ihr_Paketname] / files. Auf diese Weise wird die Datenbank von Android als Teil der App gesehen und automatisch entfernt, wenn der Benutzer die App deinstalliert.

Ich meine App ich habe eine große Datenbank und es wird inDie meisten Fälle passen nicht in den internen Speicher alter Telefone, z. HTC Desire. Es läuft hervorragend auf der SD-Karte, und die meisten Apps werden ohnehin selbst auf die SD-Karte verschoben. Machen Sie sich also keine Sorgen, dass auf die Datenbank nicht zugegriffen werden kann, da die App selbst nicht verfügbar ist.


3 für die Antwort № 3

Erstellen Sie dann Ihre eigene flache Datenbank - die meisten Leute haben nur sehr wenig internen Speicher und es ist ärgerlich, dass sie diese mit einer riesigen Datenbank auffressen.

Und was ist mit "Was ist, wenn sie die SD entfernen"?Szenario - Wenn der Benutzer die Karte entfernt, funktioniert sie offensichtlich nicht! Deutlich. Stellen Sie einfach sicher, dass beim Versuch, mit der Basis zu interagieren, kein Fehler aufgetreten ist, und teilen Sie dem Benutzer das gelöste Problem mit.


2 für die Antwort № 4

Cursor Factory wird verwendet, um eine Instanz Ihrer benutzerdefinierten Cursor-Implementierung zurückzugeben. Im Allgemeinen verwenden Sie nur SQLiteCursor. In diesem Fall wird null als Factory-Argument übergeben.


1 für die Antwort № 5

Ich würde empfehlen, keine Datenbank zu erstellenEine SD-Karte - Sie können die Lebensdauer der Karte erheblich verkürzen, da die Anzahl der möglichen Schreibvorgänge (groß, aber immer noch vorhanden) begrenzt ist und für Datenbanken einige Schreibvorgänge erforderlich sind.


1 für die Antwort № 6
public DataBaseHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION);
}

Fügen Sie auch die Berechtigung in android Manifest hinzu

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />