2016-10-04 4 views
0

App soll eine Zutat nehmen und eine Datenbank suchen und Sachen wie Kalorien und so weiter zurückgeben. Ich habe gerade die Datei von Assets geöffnet und kopiert, die Kopie geöffnet und eine Tabelle erstellt (angeblich; ich habe try catch (exception) s auf ihnen ausgeführt und sie hat gesagt, dass sie erfolgreich waren). Aber ich versuche, eine Abfrage auszuführen, gibt es einen Fehler "kann nutr_grabber.mainactivity.usdProto nicht zu int". Wenn ich versuche mit query.Energ_Kcal es gibt keinen Fehler, aber nichts zurückgibt. Irgendwelche Ideen?Android sqlite Abfrage, die nichts zurückgibt

using System; 
using Android.Views; 
using Android.Content; 
using Android.Runtime; 
using Android.App; 
using Android.Widget; 
using Android.OS; 
using Android.Content.Res; 
using System.IO; 
using SQLite; 
using System.Linq; 
using Android.Database.Sqlite; 

namespace nutr_grabber 
{ 

    [Activity(Label = "nutr_grabber", MainLauncher = true, Icon = "@drawable/icon")] 
    public class MainActivity : Activity 
    { 
     string str1; 

     // Android needs a databse to be copied from assets to a useable location 
     public void copyDataBase() 
     { 
      var dbPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "UsdDataProto.db"); 

      if (!System.IO.File.Exists(dbPath)) 
      { 
       var dbAssetStream = Assets.Open("UsdDataProto.db"); 
       var dbFileStream = new FileStream(dbPath, FileMode.OpenOrCreate); 
       var buffer = new byte[1024]; 

       int b = buffer.Length; 
       int length; 

       while ((length = dbAssetStream.Read(buffer, 0, b)) > 0) 
       { 
        dbFileStream.Write(buffer, 0, length); 
       } 

       dbFileStream.Flush(); 
       dbFileStream.Close(); 
       dbAssetStream.Close(); 
      } 
     } 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      // makes the database 
      try 
      { 
       copyDataBase(); 
       new AlertDialog.Builder(this) 
        .SetMessage("Database created ...") 
        .Show(); 
      } 
      catch(Exception e) 
      { 

       new AlertDialog.Builder(this) 
        .SetMessage("Database not created ...") 
        .Show();     

      } 


      // Set our view from the "main" layout resource 

      SetContentView(Resource.Layout.Main); 


      //set widgets 
      TextView message = FindViewById<TextView>(Resource.Id.message); 
      EditText ingred = FindViewById<EditText>(Resource.Id.enterHere); 
      Button search = FindViewById<Button>(Resource.Id.search); 

      //open sqlite connection, create table 
      var Path = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "UsdDataProto.db"); 
      var db = new SQLiteConnection(Path); 
      db.CreateTable<usdProto>(); 


      search.Click += (object sender, EventArgs e) => 
      { 
       str1 = ingred.Text; 

       var query = db.Query<usdProto>("SELECT * FROM usdProto WHERE Shrt_Desc = ?", str1); 

       foreach (var item in query) 
       { 
        new AlertDialog.Builder(this) 
         .SetMessage(item.Energ_Kcal) 
         .Show(); 
       } 
      }; 

     } 

     //---------------------------------------------------------------------------- 

     public class usdProto 
     { 
      [PrimaryKey] 
      public int NDB_No { get; set; } 
      public string Shrt_Desc { get; set; } 
      public int Energ_Kcal { get; set; } 
      public int Protein_g { get; set; } 
      public int Lipid_Tot_g { get; set; } 
      public int Ash_g { get; set; } 
      public int Carbohydrt_g { get; set; } 
      public int Fiber_TD_g { get; set; } 
      public int Sugar_Tot_g { get; set; } 
      public int Calcium_mg { get; set; } 
      public int Iron_mg { get; set; } 
      public int Magnesium_mg { get; set; } 
      public int Phosphorus_mg { get; set; } 
      public int Potassium_mg { get; set; } 
      public int Sodium_mg { get; set; } 
      public int Zinc_mg { get; set; } 
      public int Copper_mg { get; set; } 
      public int Manganese_mg { get; set; } 
      public int Selenium_ug { get; set; } 
      public int Vit_C_mg { get; set; } 
      public int Thiamin_mg { get; set; } 
      public int Riboflavin_mg { get; set; } 
      public int Niacin_mg { get; set; } 
      public int Panto_Acid_mg { get; set; } 
      public int Vit_B6_mg { get; set; } 
      public int Folate_Tot_ug { get; set; } 
      public int Folic_Acid_ug { get; set; } 
      public int Food_Folate_ug { get; set; } 
      public int Folate_DFE_ug { get; set; } 
      public int Choline_Tot_mg { get; set; } 
      public int Vit_B12_ug { get; set; } 
      public int Vit_A_IU { get; set; } 
      public int Vit_A_RAE { get; set; } 
      public int Retinol_ug { get; set; } 
      public int Alpha_Carot_ug { get; set; } 
      public int Beta_Carot_ug { get; set; } 
      public int Beta_Crypt_ug { get; set; } 
      public int Lycopene_ug { get; set; } 
      public int Lut_Zea_ug { get; set; } 
      public int Vit_E_mg { get; set; } 
      public int Vit_D_ug { get; set; } 
      public int Vit_D_IU { get; set; } 
      public int Vit_K_ug { get; set; } 
      public int FA_Sat_g { get; set; } 
      public int FA_Mono_g { get; set; } 
      public int FA_Poly_g { get; set; } 
      public int Cholestrl_mg { get; set; } 
      public int Gm_unit { get; set; } 
      public int num { get; set; } 
      public int unit { get; set; } 
     } 
    } 
} 

Es ist auf jeden Fall Daten in der Assets-Datei: enter image description here

+0

1) Warum rufen Sie CreateTable, wenn Sie bereits eine Datenbank mit Daten haben? 2) Wenn Sie ein Textfeld abfragen, müssen Sie 'um den Abfrageparameter legen. 3) Haben Sie versucht, die Punkte in der Tabelle zu zählen, um zu überprüfen, ob sie Ihren Erwartungen entsprechen? – Jason

+0

1) Ich kann nichts über das Abfragen einer db ohne es finden, da ich neu bin ich versuche, basierend auf anderen Beispielen zu gehen. Wenn ich nur "var table = db.Table ();" mache, bekomme ich das gleiche. 2) wenn ich '' um str1 herumlege, gibt es einen Fehler. 3) Ja, ich habe sie gezählt und es sollte stimmen. – Steve

+0

Sie müssen keine Tabelle erstellen, wenn Sie eine vorhandene Datenbank mit Tabellen haben. Wenn Sie einen Link zu Ihrem Code poste ich werde es über – Jason

Antwort

1

Es gibt eine große Anzahl von Dingen ist falsch mit Ihrem Code. Dies sind die Highlights:

  1. die Datei in Ihrem Vermögen Ordner ist keine SQLite DB

  2. der Tabellenname in der db (sobald Sie fix # 1) ist 'USDADataProto', nicht 'usdProto' . Sie fragen eine Tabelle ab, die nicht existiert.

  3. Ihre Mapping-Klasse die richtigen Tabellennamen verwenden soll, 'USDADataProto'

  4. Ihre Daten in allen Großbuchstaben, so dass Sie für das berücksichtigen müssen, wenn

wie diese Abfrage:

var query = db.Query<USDADataProto>("SELECT * FROM USDADataProto where Shrt_Desc = ?",str1.ToUpper()); 

foreach (var item in query) 
{ 
    new AlertDialog.Builder(this) 
    .SetMessage(item.Shrt_Desc) 
    .Show(); 
} 
+0

Ich bin sauer auf mich selbst für die Verwendung der falschen Datei die ganze Zeit. Aber es funktioniert endlich. Vielen Dank, du bist ein Lebensretter. – Steve