/ / Base de données SQLite sur carte SD - android, sqlite, android-sdcard

Base de données SQLite sur carte SD - android, sqlite, android-sdcard

Je cherche à créer une base de données sqlite sur la carte SD (je ne veux pas utiliser le stockage interne de l'utilisateur). Je connais bien le modèle OpenHelper:

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

...

donc si nous voulons créer sur la carte sd, je pense que nous devons plutôt utiliser:

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

Mais quel est l'argument «usine» censé être, quelle usine doit être utilisée?

Aussi un peu inquiet de ce qui se passe si l'utilisateur retire la carte SD pendant que mon application est en cours d'utilisation.

Merci

Réponses:

9 pour la réponse № 1

Je n'ai pas essayé de faire ce que tu décris là-bas,mais sans doute cela pourrait être fait et pourrait fonctionner - avec quelques mises en garde. Tout d'abord, le stockage externe (carte SD) n'est pas sécurisé, donc toute autre application, ou l'utilisateur, pourrait y lire / écrire. Deuxièmement, comme vous l'avez noté, lorsqu'elle est démontée, la DB disparaît.

En raison de ces inconvénients, vousil vaut probablement mieux essayer d'utiliser une base de données de stockage interne (par défaut), qui est petite et inclut éventuellement des pointeurs vers des données externes (comme des images ou des fichiers) - qui peuvent elles-mêmes se trouver sur le stockage externe (et qui ont des espaces réservés, ou autre manipulation, lorsque le stockage externe n'est pas disponible).

Pourtant, si vous voulez l'essayer, vous feriez mieux de remplacer le getDatabasePath méthode de Le contexte, comme avec le vôtre Application objet, puis passez cette dans un régulier SQLiteOpenHelper. Vous n'aurez alors plus à vous soucier de la fabrique de curseurs (qui est facultative, comme le confirme la source - il vous suffit donc de passer null si vous souhaitez suivre cette voie).


9 pour la réponse № 2

Faites cela dans votre constructeur SQLiteOpenHelper:

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

Il créera la base de données dans le dossier de l'applicationsur la carte SD: / sdcard / Android / data / [your_package_name] / files. De cette façon, la base de données sera considérée comme faisant partie de l'application par Android et supprimée automatiquement si l'utilisateur désinstalle l'application.

J'ai mon application, j'ai une grande base de données et ellela plupart des cas ne tiennent pas sur la mémoire interne des anciens téléphones, par ex. HTC Desire. Il fonctionne très bien sur la carte SD, et la plupart des applications sont elles-mêmes "déplacées vers la carte SD", alors ne vous inquiétez pas si la base de données n'est pas accessible, car l'application ne sera pas accessible elle-même.


3 pour la réponse № 3

Ensuite, créez votre propre base de données plate - la plupart des gens ont très peu de mémoire interne, et c'est ennuyeux de les manger avec une énorme base de données.

Et en ce qui concerne "que faire s'ils suppriment le SD"scénario - si l'utilisateur retire la carte, évidemment, cela ne fonctionnera pas! Clairement. Vérifiez simplement que vous n'avez pas reçu d'erreur en essayant d'interagir avec la base, et si c'est le cas, dites-le simplement à l'utilisateur - le problème est résolu.


2 pour la réponse № 4

La fabrique de curseurs est utilisée pour renvoyer une instance de votre implémentation de curseur personnalisée. En général, vous utilisez simplement SQLiteCursor, auquel cas null est passé comme argument d'usine.


1 pour la réponse № 5

Je déconseille de mettre une base de données surune carte SD - vous diminuerez considérablement la durée de vie de la carte, car elle a une limite (grande, mais toujours existante) sur le nombre d'écritures possibles et les bases de données nécessitent pas mal d'écritures.


1 pour la réponse № 6
public DataBaseHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION);
}

Ajouter également une autorisation dans le manifeste Android

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