【发布时间】: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(),你可以猜到,它只返回第一行。
-
这正是数据库旨在解决的问题。
-
我一直在尝试,但数据库并没有真正为我工作。有没有办法只搜索文件并获取该行?
-
阅读每一行,直到找到你想要的那一行