2011-07-17 4 views
1

J'ai de la difficulté à construire une application android qui a une base de données pré-remplie.Base de données préremplie - Application Android

S'il vous plaît jeter un oeil à l'ensemble source code.

J'ai créé une base de données en utilisant sqlitebrowser et copié le répertoire "assets" dans mon application Android.

j'ai ajouté le code de copier la base de données à partir des actifs répertoire dans une classe Java DBAdapter.java

En MainActivity.java j'ai appelé fonction createDatabase si la base de données n'existe pas, il doit copier la base de données à partir du répertoire des actifs. Après avoir créé la base de données, j'appelle la fonction getAllContacts et l'affiche sur la page.

Chaque fois que j'exécute le projet, il génère une erreur que je ne suis pas en mesure de déboguer.

Quelqu'un peut-il m'aider s'il vous plaît pour résoudre le problème?

MISE À JOUR:

Logcat montre l'exception suivante. Il semble que la table "contacts" dans assets/MyDB.db n'est pas copiée/créée mais je ne sais pas pourquoi.

E/AndroidRuntime( 672): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.me.mydb/org.me.mydb.MainActivity}: android.database.sqlite.SQLiteException: no such table: contacts: , while compiling: SELECT _id, name, email FROM contacts 
E/AndroidRuntime( 672):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
E/AndroidRuntime( 672):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
E/AndroidRuntime( 672):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
E/AndroidRuntime( 672):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
E/AndroidRuntime( 672):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 672):  at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 672):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
+0

qu'est-ce que logcat dit à ce sujet ...? – Necronet

+0

Où puis-je voir les journaux? Désolé, je suis un débutant à Android – Peter

+0

vous devez le voir sur la manuallyhttp console: //developer.android.com/guide/developing/tools/logcat.html si vous utilisez ADT il est livré avec un Logcat Voir pour voir vos journaux – Necronet

Répondre

0

Bien DataHelper est livré avec une méthode onCreate vous pouvez y créer la base de données y même.

Official Android documentation

Appelé lorsque la base de données est créée pour la première fois. C'est où la création de tables et la population initiale des tables devrait se produire.

en fait, vous haved remplacer cette méthode

@Override 
     public void onCreate(SQLiteDatabase db) 
     { 

     } 
+0

Yeaaaah Je sais qu'il est possible de créer la base de données en utilisant la fonction onCreate ... Mais s'il y a des centaines/milliers de lignes qui ont déjà été créées dans le fichier de base de données ?? La plupart des exemples et des tutoriels Android là-bas dans le web, créer et alimenter la base de données lors de l'exécution ... Je suis à la recherche d'un exemple/tutoriel qui peut une base de données indépendante, préchargé avec l'application Android. Pourriez-vous s'il vous plaît laissez-moi savoir quel est le problème dans mon code? – Peter

0

J'utilise la gestion des événements onCreate et un ensemble de scripts * .sql (exécuté ligne par ligne en simple boucle).

Ceci est pratique lorsque vous devez également écrire des routines de mise à jour de base de données. J'ai un script sql pour initialiser une nouvelle base de données (mise à jour) et un ensemble de scripts SQL pour chaque version obsolète de la base de données.

par exemple. Le script sql "create" est appelé chaque fois qu'une nouvelle base de données doit être initialisée, ou une chaîne de scripts "v1-update-to-v2" et "v2-update-to-v3" est appelée chaque fois que l'utilisateur doit mettre à jour sa base 1 à la version 3. Ceci est plus lent que le script de mise à jour unique par version (comme "v1-update-to-v3" et "v2-update-to-v3") mais cette "chaîne" est plus facile à maintenir (Je n'ai pas besoin de changer quoi que ce soit dans les vieux scripts).

+0

Serait-il possible de partager n'importe quel code source? – Peter

2

Voici un bon link pour commencer. Essentiellement, l'idée est d'utiliser la classe SQLiteOpenHelper et quand aucune base de données existe, vous copiez votre octet de base de données pré-ensemencé pour l'octet dans l'emplacement correct.Je l'ai dans un projet de la mine légèrement modifié mais il fonctionne semble fonctionner très bien

+0

J'utilise également cette implémentation et je la recommande. Cependant, parfois il peut être un peu inconstant et ne copie pas la base de données entière correctement, alors assurez-vous de vérifier quelque part dans votre application qu'il a bien copié. –

+0

@ Paul.s J'ai suivi la même procédure donnée dans le lien .. mais cela n'a pas fonctionné. Serait génial si vous pouviez déboguer mon code et laissez-moi savoir où le problème existe .. – Peter

+0

@Espiandev Serait-il possible pour vous de m'envoyer le code de travail/projet? – Peter

0

Remplacer la ligne qui dit copyDBFromResource(); avec le code suivant -

 SQLiteDatabase readDB = null; 
     readDB = this.getReadableDatabase(); 
     readDB.close(); 
     readDB = null; 
     copyDBFromResource(); 

Je pense que cela est nécessaire parce que votre code ne peut pas lui-même créer des fichiers dans le dossier de données, et faire un appel à getReadableDatabase() crée le fichier db pour vous là-bas. Et à partir de la version 2.2 d'Android, vous devez fermer la base de données après y avoir accédé sinon la copie échouera.

Edit:

Si cela ne fonctionne toujours pas, essayez de donner l'autorisation d'écriture de stockage externe comme suit -

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

Merci .. mais il n'a pas fonctionné aussi bien :( – Peter

+0

Pourriez-vous essayer ? l'autorisation de donner WRITE_EXTERNAL_STORAGE (juste après le nœud d'application dans votre manifeste) comme je l'ai décrit dans l'édition ci-dessus –

+0

@Abinav où dois-je ajouter ? Sho uld j'ajoute dans AndroidManifest.xml? – Peter

Questions connexes