【问题标题】:Xamarin/Visual Studio 2015 - Should I use sqlite and query issues,Xamarin/Visual Studio 2015 - 我应该使用 sqlite 和查询问题吗?
【发布时间】:2016-09-30 17:10:02
【问题描述】:

Xamarin 和 c# 的新手,但我正在尝试为我的班级制作一个非常简单的应用程序,该应用程序在数据库中搜索一种成分并返回营养信息。我的小组知道python,所以他们用它写了代码,我试图让一个应用程序尽可能简单,只是为了展示,但我遇到了一些麻烦。我们从他们的网站下载了 USDA 数据库,文件中的数据在

"NDB_No,Shrt_Desc,Energ_Kcal,Protein_g,Lipid_Tot_g,Ash_g,Carbohydrt_g,Fiber_TD_g,Sugar_Tot_g,Calcium_mg,Iron_mg,Magnesium_mg,Phosphorus_mg,Potassium_mg,Sodium_mg,Zinc_mg,Copper_mg,Manganese_mg,Selenium_ug,维生素C_mg Panto_Acid_mg,Vit_B6_mg,Folate_Tot_ug,Folic_Acid_ug,Food_Folate_ug,Folate_DFE_ug,Choline_Tot_毫克,Vit_B12_ug,Vit_A_IU,Vit_A_RAE,Retinol_ug,Alpha_Carot_ug,Beta_Carot_ug,Beta_Crypt_ug,Lycopene_ug,甩+ Zea_微克,Vit_E_mg,Vit_D_ug,Vit_D_IU,Vit_K_ug,FA_Sat_g,FA_Mono_g,FA_Poly_g, Cholestrl_mg,Gm_unit,num,unit"

包含数百种成分的格式。比如

"1145,BUTTER,717,0.85,81.11,0.09,0.06,0,0.06,24,0.02,2,24,24,11,0.09,0.016,0.004,1,0,0.005,0.034,0.042, 0.11,0.003,3,0,3,3,18.8,0.17,2499,684,671,0,158,0,0,0,2.32,0,0,7,50.489,23.43,3.01,215,5,1,tbsp"

他们使用 sqlite3 建表并在 Python 中查询,只是使用 c.fetchrow 返回一行数据和一个数组来划分它。该代码可以在这里找到:https://github.com/pjomara/SoftwareEngineeringIIProject/blob/master/nutr_data_grabber.py

我找不到任何好的示例,也不需要创建数据库,只需从我拥有的数据库中读取即可。 我被困住了,任何帮助、示例代码等都会很棒。谢谢

当前错误是“ 错误 CS1503 参数 1:无法从 'SQLite.TableQuery' 转换为 'int' nutr_grabber C:\Users\Steve\Documents\Visual Studio 2015\Projects\nutr_grabber\nutr_grabber\MainActivity.cs 53 Active"

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

    private static string DB_PATH = "/data/data/nutr_grabber/databases/";

    private static string DB_NAME = "UsdDataProto.db";

    private void copyDataBase()
    {
        var dbInput = ApplicationContext.Assets.Open(DB_NAME);
        string dbProto = DB_PATH + DB_NAME;
        var myOutput = new FileStream(dbProto, FileMode.OpenOrCreate);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = dbInput.Read(buffer, 0, 1024)) > 0)
            myOutput.Write(buffer, 0, length);
        myOutput.Flush();
        myOutput.Close();
        dbInput.Close();
    }


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

        // 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);

        string proto = DB_PATH + DB_NAME;
        //string folder = System.Environment.GetFolderPath();
        var db = new SQLiteConnection(System.IO.Path.Combine( proto , "UsdDataProto.db"));
        db.CreateTable<usdProto>();



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



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



              new AlertDialog.Builder(this)
              .SetMessage(Item)
              .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; }

【问题讨论】:

  • 有很多很多关于将 sqlite 与 Xamarin 结合使用的示例、演练等。我会尝试阅读它们,然后如果您有一个或多个特定问题,请询问。例如,developer.xamarin.com/guides/cross-platform/…
  • 我搜索了这么久,我没有找到的一件事会很有用。实际上,我只需使用streamreader打开文件就可以读取一行。关于如何在文件中搜索某些东西的任何建议,比如“黄油”然后返回该行?我现在只有 ReadLine(),你可以猜到,它只返回第一行。
  • 这正是数据库旨在解决的问题。
  • 我一直在尝试,但数据库并没有真正为我工作。有没有办法只搜索文件并获取该行?
  • 阅读每一行,直到找到你想要的那一行

标签: android sqlite xamarin


【解决方案1】:

您的查询将返回一个 IEnumerable 对象,在您的情况下是 usdProto:

var query = db.Table<usdProto>().Where(v => v.Shrt_Desc.Contains(str1));

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

将 SomeProperty 替换为您要显示的 usdProto 的任何属性

【讨论】:

  • 我没有错误,但没有任何反应。我做错了 usdProto 类吗?
  • 您确定您的表中有数据吗?
  • 根据您的代码,您正在创建和清空数据库并在其中创建一个空表,而不是打开嵌入在您的应用中的现有数据库
  • 我的分贝肯定有数据。也许我尝试打开它错误,它只是我资产文件夹中的一个文件。
  • 您正在个人中创建一个空白数据库,而不是打开现有资产文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多