Android: copie de base de données à partir d'actifs dossier, mais seulement obtenir un fichier vide
les gars, j'ai le problème lors de la copie de la base de données à partir d'actifs locaux dossier /data/data/nom_du_paquet/répertoire des bases de données. Comme je l'ai utiliser le http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ tutoriel pour le faire, je ne peux obtenir un fichier vide.
J'ai cité le cadre de copyDataBase() la méthode et il n'y a pas de différence. Chaque fois que l'application de commencer, il va créer le répertoire et base de données vide. Donc, est-il possible de faire la copyDataBase ()?
Merci beaucoup!!
plz ajouter votre code..
Quelle est la taille de votre base de données? Éventuellement, le long des lignes de stackoverflow.com/questions/5789177/...
Quelle est la taille de votre base de données? Éventuellement, le long des lignes de stackoverflow.com/questions/5789177/...
OriginalL'auteur 4af2e9eb6 | 2011-05-25
Vous devez vous connecter pour publier un commentaire.
je ne serais pas la copie sous forme de base de laSi vous avez besoin d'une norme d'entrée dans votre Base de données, vous pouvez les ajouter à l'aideassets
-dossier.INSERT
s dans votreonCreate()
-méthode.Mise à jour: Puisque c'est passer voté pour tromper (ce qui est un peu à droite) et je ne peux pas le supprimer, voici une petite mise à jour.
Je dirais ça dépend le nombre standard d'entrées que vous souhaitez ajouter à votre base de données. Si c'est juste un ou deux, de livraison des paniers-DB peut-être pas la peine.
De toute façon, certaines applications viennent avec, plutôt de grandes bases de données (par exemple, une collection de recettes). Vous pouvez évidemment pas à l'ajouter à tous ces dans le code.
onCreate()
.Pour la plus tard de travailler, vous aurez besoin de copier le fichier de base de données à partir de
assets/
à votre application-dossier. Il y a une belle bibliothèque pour gérer cela pour vous: android-sqlite-actif-helperPourquoi ne pas copier un fichier de base de données à partir d'actifs? Dans mon cas, c'est un R/O base de données avec 19 tables et 35k lignes de valeur de l'insert. Je ne vois pas pourquoi je voudrais initialiser une base de données sur l'appareil. Est-il quelque chose que je suis absent?
Est-il de toute façon n'ont pas besoin de copie de dossier de données ? Pourrions-nous lire directement à partir du dossier des actifs ?
OriginalL'auteur Lukas Knuth
Pourquoi ne pas vous copiez à partir d'actifs? Il est parfaitement normal de le faire. Mais vous ne pouvez pas le faire dans le onCreate, à ce point une base de données vide est déjà créé. Vous devez le faire avant. J'ai l'habitude de le faire dans une substitution de getWriteableDatabase, quelque chose comme
J'ai dû changer un peu:
if (!doesDatabaseExist()) { try { SQLiteDatabase db = super.getReadableDatabase(); db.close(); } catch (Exception ignore) {} copyFromAssets(); return super.getReadableDatabase(); }
Sinon, c'était de s'écraser avec FileNotFoundException, probablement parce que le répertoire de base de données n'existe pas. (Android 2.2)OriginalL'auteur Greg Pasquariello
Je ne sais pas si c'est encore utile, mais voici la solution pour d'autres qui sont ici pour voir la awnser. Le code que vous avez utilisé, fonctionne pour la plupart des téléphones, certains téléphones plus anciens ont des comportements différents avec la getReadableDatabase() fonction. Votre problème n'est donc pas dans le copyDataBase fonction, mais dans la fonction createDataBase.
dans createDataBase() il est à cocher suivantes;
Ce vérifie s'il existe déjà une base de données avec le nom de et si ne pas crée une base de données vide telle qu'elle peut être remplacée par l'une dans le dossier assets. Sur les appareils récents, cela fonctionne parfaitement, mais il ya certains appareils à laquelle cela ne fonctionne pas. Principalement des appareils plus anciens. Je ne sais pas exactement pourquoi, mais il me semble que le getReadableDatabase() fonction non seulement de la base de données, mais ouvre également. Si vous copiez la base de données à partir du dossier des actifs de plus, il a encore le pointeur à une base de données vide et vous obtiendrez le tableau n'existe pas d'erreurs.
Afin de le faire fonctionner sur tous les appareils que vous devez modifier les lignes suivantes:
Même si la base de données est ouverte dans la case, il est fermé par la suite et il ne vous donnera pas plus de problèmes.
OriginalL'auteur Tom Groentjes
au bon exemple ci-dessus a travaillé pour moi de cette façon:
sinon j'ai eu un IO erreur;
OriginalL'auteur Heraldman
Ici est simple et pratique de code que j'utilise:
}
Et de l'aide dans le code:
La clé, c'est l'appel à createEmptyDatabase(). Sans cela, l'appel à la "new FileOutputStream()" ne parvient pas, même si elle est censée créer le fichier s'il n'existe pas.
OriginalL'auteur SILINIK