7
votes

Android: Copier la base de données du dossier d'actif, mais obtenez uniquement un fichier vide

Les gars, j'ai le problème lors de la copie de la base de données du dossier d'actifs locaux sur / Data / Data / Package_Name / nom de données. Comme j'utilise le http: // www. ReignDesign.com/blog/using-Votre-Onwown-Sqlite-Database-in-Android-Applications/ Tutorial Pour le faire, je ne peux obtenir qu'un fichier vide.

J'ai cité la partie de la méthode CopyDatabase () et il n'y a pas de différence. Chaque fois que l'application commence, il créera le répertoire et la base de données vide. Alors, y a-t-il un moyen de faire du travail CopyDatabase ()?

Merci beaucoup !!


1 commentaires

Quelle est la taille de votre base de données? Éventuellement le long des lignes de Stackoverflow.com/questions/5789177/...


5 Réponses :


1
votes

Je ne copierais pas de base de données Formulaire de base de données The Actifs -Folder. Si vous avez besoin d'une entrée standard dans votre base de données, vous pouvez les ajouter à l'aide de Insérer < / code> s dans votre Oncreate () -method.


Mise à jour: puisque cela se déclenche pour avoir tort (ce qui est un peu juste) et je ne peux pas la supprimer, voici une petite mise à jour.

Je dirais Cela dépend sur le nombre d'entrées standard que vous souhaitez ajouter à votre base de données. Si c'est juste un ou deux, expédier un DB emballé pourrait ne pas en valoir la peine.

Quoi qu'il en soit, certaines applications sont livrées avec des bases de données assez importantes (par exemple, une collection de recettes). Vous ne pouvez évidemment pas ajouter tout cela en code.

  • Pour de petites entrées de test, je préférerais toujours les ajouter dans Oncreate () .
  • Pour les bases de données plus grandes, vous devriez les pré-peupler et les expédier à votre application.

    Pour que le dernier fonctionnement, vous aurez besoin de copier le fichier de base de données depuis actifs / à votre dossier d'application. Il y a une belle bibliothèque pour vous gérer pour vous: Android-SQLite-Asset-Assess-Helper


3 commentaires

Merci! C'est juste 2 heures de travail. :)


Pourquoi ne pas copier un fichier dB des actifs? Dans mon cas, c'est une base de données R / O avec 19 tables et des lignes de 35 k d'insertion d'insertion. Je ne vois aucune raison pour que je voudrais initialiser une telle base de données sur l'appareil. Y a-t-il quelque chose qui me manque?


Y a-t-il un moyen qui n'a pas besoin de copier dans le dossier de données? Pourrions-nous lire directement du dossier d'actifs?



15
votes

Pourquoi ne voudriez-vous pas copier des actifs? C'est parfaitement normal de le faire. Mais vous ne pouvez pas le faire dans l'Oncreate, à ce stade, une base de données vide est déjà créée. Vous devez le faire avant. Je le fais habituellement dans une substitution de GetWritreeaDatabase, quelque chose comme xxx


2 commentaires

Travaille pour moi (Android 2.3.3). Propre et solide.


Je devais le changer un peu: si (! Databaseexist ()) {Essayez {SQLITEDATABASE DB = Super.GetReDeadAbatabase (); db.close (); } Catch (EXCEPTION IGNORE) {} CopyFromAssets (); retour Super.GetReDeadAbatabase (); } Sinon, il écrasait avec FilenotFoundException, probablement parce que le répertoire de la base de données n'existait pas. (Android 2.2)



0
votes

à droite au-dessus d'exemple a fonctionné pour moi de cette façon: xxx

sinon j'ai eu une erreur IO;


0 commentaires

0
votes

Voici le code simple et pratique que j'utilise: xxx

}

et en utilisant le code: xxx


1 commentaires

La clé est l'appel à CreateDeTyDatabase (). Sans cela, l'appel à "New FileOutPutStream ()" échoue, même s'il est censé créer le fichier s'il n'existe pas.



1
votes

Je ne sais pas si c'est toujours utile, mais voici la solution pour d'autres personnes qui arrivent ici pour voir l'Awnser. Le code que vous avez utilisé fonctionne pour la plupart des téléphones, certains téléphones plus anciens ont un comportement différent de la fonction getReadAfhableBase (). Votre problème n'est donc pas dans la fonction CopyDatabase, mais dans la fonction crééeAbase.

en crééatabase () Il existe le chèque suivant; P>

SQLiteDatabase db = this.getReadableDatabase();
if (db.isOpen()){
    db.close();
}


0 commentaires