2011-09-04 9 views
-1

J'ai une application Monodroid. où j'utilise Mono.Data.SQLite et Sytem.Data afin de se connecter à une base de données SQLite. Si je crée la base de données de manière programmatique cela fonctionne très bien, mais si je place ma base de données "test.db" dans le dossier Assets et que j'essaie de la copier, j'obtiens une exception FileNotFoundException. Ci-dessous le code que j'utilise pour essayer de copier la base de données et ensuite me connecter.Monodroid comment copier la base de données

public class Activity1 : Activity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     TextView tv = new TextView(this); 
     string dbPath = Path.Combine(
     System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), 
     "test.db"); 

     bool exists = File.Exists(dbPath); 
     if (!exists) 
      SqliteConnection.CreateFile(dbPath); 
     var connection = new SqliteConnection("Data Source=" + dbPath); 
     connection.Open(); 
     if (!exists) 
     { 
      Stream myInput = Assets.Open("test.db"); 
      String outFileName = dbPath + "test.db"; 
      Stream myOutput = new FileStream(outFileName, FileMode.OpenOrCreate); 

      byte[] buffer = new byte[1024]; 
      int b = buffer.Length; 
      int length; 
      while ((length = myInput.Read(buffer, 0, b)) > 0) 
      { 
       myOutput.Write(buffer, 0, length); 
      } 

      myOutput.Flush(); 
      myOutput.Close(); 
      myInput.Close(); 
     } 

     using (var contents = connection.CreateCommand()) 
     { 
      contents.CommandText = "SELECT [Field1], [Field2] from [Table]"; 
      var r = contents.ExecuteReader(); 
      while (r.Read()) 
       tv.Text += string.Format("\n\tField1={0}; Field2={1}", 
         r["Field1"].ToString(), r["Field2"].ToString()); 
     } 
     connection.Close(); 


     SetContentView(tv); 
    } 
} 

}

Répondre

2

À première vue, je vois quelques problèmes possibles ici:

  1. L'action est de construire le fichier dans votre dossier actif mis à AndroidAsset?
  2. Lorsque le fichier n'existe pas, vous écrivez à dbPath + "test.db", mais dbPath contient déjà le nom du fichier
  3. Je vous recommande de vérifier/créer le fichier avant de créer et d'ouvrir la connexion
+0

Merci beaucoup! Une fois l'action de construction a été définie et le + "test.db" a été supprimé après dbpath tout a fonctionné comme prévu :). Maintenant, j'ai juste besoin de le nettoyer, et de déplacer la connexion comme suggéré. –

Questions connexes