[英]How do I save Json output to a SQLite database in c#?
I'm trying to make an app in xamarin forms that gets information from bittrex then puts it into a model and then saves it to the local SQLite database. 我正在尝试以xamarin形式制作一个从bittrex获取信息的应用程序,然后将其放入模型中,然后将其保存到本地SQLite数据库中。
Here is my code for saving things to the database: 这是我将代码保存到数据库的代码:
public class CoinsDatabase
{
readonly SQLiteAsyncConnection database;
public CoinsDatabase(string dbPath)
{
database = new SQLiteAsyncConnection(dbPath);
database.CreateTableAsync<Coins>().Wait();
}
public Task<List<Coins>> GetCoinsAsync()
{
return database.Table<Coins>().ToListAsync();
}
public Task<Coins> GetCoinsAsync(int id)
{
return database.Table<Coins>().Where(i => i.CoinID == id).FirstOrDefaultAsync();
}
public Task<int> SaveCoinAsync(Coins coin)
{
if(coin.CoinID == 0){
return database.InsertAsync(coin);
} else {
return database.UpdateAsync(coin);
}
}
public Task<int> DeleteCoinAsync(Coins coin)
{
return database.DeleteAsync(coin);
}
Here is my code for getting the Json information and processing it: 这是获取和处理Json信息的代码:
async void Save_Clicked(object sender, System.EventArgs e)
{
if (CoinNameEntry.Text != null){
var uri = new Uri("https://bittrex.com/api/v1.1/public/getmarketsummary?market=btc-" + CoinNameEntry.Text.ToLower());
HttpClient httpClient = new HttpClient();
var response = await httpClient.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
Coins coins = JsonConvert.DeserializeObject<Coin>(content);
var coinItem = (Coins)coins["result"].ToObject<Coins>();
await App.Database.SaveCoinAsync(coinItem);
await Navigation.PopAsync();
} else {
await DisplayAlert("Alert", "An error occured getting the coininformation of " + CoinNameEntry.Text.ToUpper(), "OK");
}
} else {
await DisplayAlert("Alert", "Please select a Coin first", "OK");
}
}
And this is my Coins model: 这是我的硬币模型:
public class Coins
{
public List<Coin> coins { get; set; }
}
public class Coin
{
[PrimaryKey, AutoIncrement]
public int CoinID { get; set; }
public string CoinName { get; set; }
public bool Notification { get; set; }
public string MarketName { get; set; }
public double High { get; set; }
public double Low { get; set; }
public double Volume { get; set; }
public double Last { get; set; }
public double BaseVolume { get; set; }
public bool TimeStamp { get; set; }
public double Bid { get; set; }
public double Ask { get; set; }
public int OpenBuyOrders { get; set; }
public int OpenSellOrders { get; set; }
public double PrevDay { get; set; }
public string Created { get; set; }
}
I have been trying to get this working for a week now and I was wondering if someone knows what i do wrong or if someone has tips on how to fix this problem. 我一直在努力使它工作一个星期,我想知道是否有人知道我做错了什么,或者有人是否提供解决此问题的技巧。
Please keep in mind that im a beginner with xamarin and C# :) 请记住,我是xamarin和C#的初学者:)
OK, try this: First, add a JsonProperty
to your coins class to map the result to the correct property: OK,尝试以下操作:首先,将JsonProperty
添加到您的钱币类中,以将结果映射到正确的属性:
public class Coins
{
[JsonProperty("result")]
public List<Coin> coins { get; set; }
}
Then replace the following two lines in your code: 然后在代码中替换以下两行:
Coins coins = JsonConvert.DeserializeObject<Coin>(content);
var coinItem = (Coins)coins["result"].ToObject<Coins>();
with 与
Coins coins = JsonConvert.DeserializeObject<Coins>(content);
var coinItem = coins.coins[0];
Please note that this will give you the first of the coins in the list - change the index or use LINQ if you want to retrieve a coin from somewhere else in the list. 请注意,这将为您提供列表中的第一个硬币-如果要从列表中的其他位置检索硬币,请更改索引或使用LINQ。
I also very much suspect that your SQLite code won't do what you want. 我也非常怀疑您的SQLite代码不会执行您想要的操作。 Currently all your methods act on a Coins object rather than a Coin object. 当前,您的所有方法都作用于Coins对象而不是Coin对象。 Try changing the methods to 尝试将方法更改为
readonly SQLiteAsyncConnection database;
public CoinsDatabase(string dbPath)
{
database = new SQLiteAsyncConnection(dbPath);
database.CreateTableAsync<Coin>().Wait();
}
public Task<List<Coin>> GetCoinsAsync()
{
return database.Table<Coin>().ToListAsync();
}
public Task<Coin> GetCoinsAsync(int id)
{
return database.Table<Coin>().Where(i => i.CoinID == id).FirstOrDefaultAsync();
}
public Task<int> SaveCoinAsync(Coin coin)
{
if(coin.CoinID == 0){
return database.InsertAsync(coin);
} else {
return database.UpdateAsync(coin);
}
}
public Task<int> DeleteCoinAsync(Coin coin)
{
return database.DeleteAsync(coin);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.