Base de données SQLite sur carte SD
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 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 " supposé être, quelle usine devrait être utilisée?
également un peu inquiet de ce qui se passe si l'utilisateur supprime la carte SD pendant que mon application est utilisée..
Merci
6 réponses
Je n'ai pas essayé de faire ce que vous décrivez là, mais probablement 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é, de sorte que toute autre application, ou l'utilisateur, pourrait lire/écrire à elle. Deuxièmement, comme vous l'avez noté, quand il n'est pas monté, le frein rhéostatique disparaît.
en raison de ces inconvénients, vous seriez probablement mieux d'essayer d'utiliser une base de données de stockage interne (la valeur par défaut), qui est petite et peut-être inclut pointeurs vers des données externes (comme des images ou des fichiers) -- qui elles-mêmes peuvent être sur le stockage externe (et qui ont des placeholders, ou d'autres manipulations, lorsque le stockage externe n'est pas disponible).
Encore, si vous voulez l'essayer, vous pourriez être mieux de remplacer le getDatabasePath méthode de Contexte , comme avec votre propre Application objet, puis passer que dans un régulier SQLiteOpenHelper . Alors vous n'auriez pas à vous soucier de l'usine de curseur (qui est optionnel, comme la source confirme -- donc il suffit de passer null si à la place vous voulez aller sur cette route).
dans votre SQLiteOpenHelper constructeur:
DatabaseHelper(Context context) {
super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION);
}
il va créer la base de données dans le dossier de l'application sur le sdcard: /sdcard/Android/data/[your_package_name]/fichiers. De cette façon, la base de données sera considéré comme faisant partie de l'application par android et supprimés automatiquement si l'utilisateur désinstalle l'application.
j'ai mon application j'ai une base de données importante et il sera, dans la plupart des cas, de ne pas tenir sur les vieux téléphones mémoire interne, par exemple le Désir de HTC. Il fonctionne bien sur le sdcard, et la plupart des applications sont "déplacés vers sdcard" eux-mêmes de toute façon donc ne vous inquiétez pas que la base de données n'est pas accessible, parce que l'application ne sera pas accessible en soi.
alors faites votre propre base de données plate - la plupart des gens ont très peu de mémoire interne, et il est ennuyeux qu'ils mangent avec la base de données énorme.
et quant au scénario "et s'ils suppriment le SD" - si l'utilisateur supprime la carte évidemment il ne va pas fonctionner! Clairement. Il suffit de vérifier que vous n'avez pas eu une erreur en essayant d'interagir avec la base, et si vous l'avez fait, il suffit de vous dire utilisateur - Problème résolu.
Cursor factory est utilisé pour retourner une instance de votre implémentation de curseur personnalisée. Généralement vous n'utilisez que SQLiteCursor, auquel cas null est passé comme argument d'usine.
je recommande de ne pas placer une base de données sur une carte SD - vous diminuerez considérablement la durée de vie de la carte, car il a une (grande, mais encore existante) limite sur le nombre d'Écritures possibles et les bases de données nécessitent un certain nombre d'Écritures.
public DataBaseHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION);
}
ajouter aussi permission dans le manifeste android
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />