2011-08-01 6 views
0

J'ai suivi les nombreux tutoriels en ligne sur la façon de copier un fichier DB du dossier "assets" du dossier "/ data/data // databases" de l'application. Avec mon code, il échoue la première fois de l'ouvrir et de copier la base de données. Comme les didacticiels disent qu'il crée une base de données vide dans laquelle ma base de données est copiée, mais cela ne semble pas fonctionner pour moi. Le code est exactement le même que partout ailleurs. Mais ici c'est quand même avec les Logs appropriés.Copier la base de données du dossier Assets dans l'application

public void createDataBase() throws IOException{ 

     boolean dbExist = checkDataBase(); 
     SQLiteDatabase db_Read = null; 

     if(dbExist){ 
      //do nothing - database already exist 
      Log.v("DBHandler", "Database does exist"); 
     }else{ 
      //By calling this method and empty database will be created into the default system path 
      //of your application so we are gonna be able to overwrite that database with our database. 
      Log.v("DBHandler", "Database does not exist"); 

      db_Read = this.getReadableDatabase(); 
      db_Read.close(); 

     try { 
       copyDataBase(); 
      } catch (IOException e) { 
       throw new Error("error copying database"); //Error gets thrown here 
      } 
     } 

    } 


private void copyDataBase() throws IOException{ 

    //Open your local db as the input stream 
    InputStream myInput = myContext.getAssets().open(DB_NAME); 

    // Path to the just created empty db 
    String outFileName = DB_PATH + DB_NAME; 

    //Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 

    //transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer))>0){ 
      myOutput.write(buffer, 0, length); 
    } 

    //Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

} 

je reçois l'erreur suivante dans le journal:

08-01 14:34:25.046: ERROR/Database(27530): sqlite3_open_v2("/data/data/com.package/databases/DB.sqlite", &handle, 1, NULL) failed 

Je suis assez certain que l'erreur est dans la copie de la base de données sur. Si plus d'informations sont nécessaires je serai heureux de le fournir.

EDIT: Je suis sûr que l'erreur est dans la copie de la base de données, tous les répertoires de chemin sont corrects. Je pense que cela a quelque chose à voir avec la ligne: InputStream myInput = myContext.getAssets().open(DB_NAME); avec peut-être le contexte passé par être mauvais, mais je ne peux pas voir comment.

+0

Veuillez vérifier votre code (et votre question aussi). Vous le copiez dans "data/data // databases"? Êtes-vous sûr que DB_NAME correspond à la base de données sur votre chemin ou avez-vous simplement copié et collé un exemple de code? Etes-vous sûr que DB_PATH est l'endroit où vous souhaitez placer la base de données? –

+0

@Nathan Fig: Oui, je suis sûr que le chemin est correct, le code fonctionne pour mon téléphone c'est dans l'émulateur que je reçois ces erreurs. J'ai entendu certains appareils fonctionner différemment en ce qui concerne l'ouverture de bases de données et ont eu des problèmes similaires à cela avec d'autres applications. – SamRowley

+0

J'ai juste essayé de copier le fichier de base de données sur la carte SD et j'ai pu l'ouvrir à partir de là sans problème. Y a-t-il une raison pour que ce soit une mauvaise idée? – Kurru

Répondre

0

Vous copiez la base de données à l'aide d'opérations de fichier standard alors que le message d'erreur fait clairement référence à sqlite. Ainsi, l'erreur se produit probablement lorsque vous essayez d'ouvrir une base de données non existante. S'il y a une trace de pile, cela montrera exactement où cela se passe.

Enfin, je recommande de ne pas utiliser la classe Error car elle est réservée aux erreurs VM. Utilisez RuntimeException et toujours inclure la cause de la racine.

Questions connexes