如何将Json输出保存到c#中的SQLite数据库?
我正在尝试用xamarin表单制作一个应用程序,从bittrex获取信息,然后将其放入模型中,然后将其保存到本地SQLite数据库中 以下是我将内容保存到数据库的代码:如何将Json输出保存到c#中的SQLite数据库?,c#,json,sqlite,xamarin,xamarin.forms,C#,Json,Sqlite,Xamarin,Xamarin.forms,我正在尝试用xamarin表单制作一个应用程序,从bittrex获取信息,然后将其放入模型中,然后将其保存到本地SQLite数据库中 以下是我将内容保存到数据库的代码: public class CoinsDatabase { readonly SQLiteAsyncConnection database; public CoinsDatabase(string dbPath) { database = new SQLiteAsyncConnec
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);
}
公共类CoinsDatabase
{
只读SQLiteAsyncConnection数据库;
公共CoinsDatabase(字符串dbPath)
{
数据库=新的SQLiteAsyncConnection(dbPath);
database.CreateTableAsync().Wait();
}
公共任务GetCoinsAsync()
{
返回database.Table().ToListAsync();
}
公共任务GetCoinsAsync(int id)
{
返回database.Table().Where(i=>i.CoinID==id).FirstOrDefaultAsync();
}
公共任务SaveCoinAsync(硬币)
{
如果(coin.CoinID==0){
返回数据库.InsertAsync(coin);
}否则{
返回数据库.UpdateAsync(coin);
}
}
公共任务DeleteCoinAsync(硬币)
{
返回database.DeleteAsync(coin);
}
下面是我获取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");
}
}
async void Save\u已单击(对象发送方,System.EventArgs e)
{
if(CoinNameEntry.Text!=null){
var uri=新的uri(“https://bittrex.com/api/v1.1/public/getmarketsummary?market=btc-“+CoinNameEntry.Text.ToLower());
HttpClient HttpClient=新HttpClient();
var response=wait-httpClient.GetAsync(uri);
if(响应。IsSuccessStatusCode)
{
var content=await response.content.ReadAsStringAsync();
Coins Coins=JsonConvert.DeserializeObject(内容);
var coinItem=(Coins)Coins[“result”].ToObject();
等待App.Database.SaveCoinAsync(coinItem);
等待导航。PopAsync();
}否则{
等待显示警报(“警报”,“获取“+CoinNameEntry.Text.ToUpper(),“OK”)的coininformation时出错”;
}
}否则{
等待显示警报(“警报”,“请先选择硬币”,“确定”);
}
}
这是我的硬币模型:
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; }
}
公共等级硬币
{
公共列表硬币{get;set;}
}
公共级硬币
{
[主密钥,自动增量]
公共int CoinID{get;set;}
公共字符串CoinName{get;set;}
公共bool通知{get;set;}
公共字符串MarketName{get;set;}
公共双高{get;set;}
公共双低位{get;set;}
公共双卷{get;set;}
公共双最后{get;set;}
公共双基卷{get;set;}
公共bool时间戳{get;set;}
公共双标{get;set;}
公共双询问{get;set;}
public int OpenBuyOrders{get;set;}
public int OpenSellOrders{get;set;}
公共双前一天{get;set;}
已创建公共字符串{get;set;}
}
我已经试着让它工作了一个星期了,我想知道是否有人知道我做错了什么,或者是否有人知道如何解决这个问题
请记住,我是xamarin和C#::)的初学者。好的,试试这个:首先,向您的coins类添加一个
JsonProperty
,将结果映射到正确的属性:
public class Coins
{
[JsonProperty("result")]
public List<Coin> coins { get; set; }
}
公共等级硬币
{
[JsonProperty(“结果”)]
公共列表硬币{get;set;}
}
然后替换代码中的以下两行:
Coins coins = JsonConvert.DeserializeObject<Coin>(content);
var coinItem = (Coins)coins["result"].ToObject<Coins>();
Coins Coins=JsonConvert.DeserializeObject(内容);
var coinItem=(Coins)Coins[“result”].ToObject();
与
Coins Coins=JsonConvert.DeserializeObject(内容);
var coinItem=硬币。硬币[0];
请注意,这将为您提供列表中的第一个硬币-如果您想从列表中的其他位置检索硬币,请更改索引或使用LINQ
我也非常怀疑你的SQLite代码不会做你想做的事情。目前你所有的方法都作用于Coins对象而不是Coin对象。尝试将方法更改为
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);
}
只读SQLiteAsyncConnection数据库;
公共CoinsDatabase(字符串dbPath)
{
数据库=新的SQLiteAsyncConnection(dbPath);
database.CreateTableAsync().Wait();
}
公共任务GetCoinsAsync()
{
返回database.Table().ToListAsync();
}
公共任务GetCoinsAsync(int id)
{
返回database.Table().Where(i=>i.CoinID==id).FirstOrDefaultAsync();
}
公共任务SaveCoinAsync(硬币)
{
如果(coin.CoinID==0){
返回数据库.InsertAsync(coin);
}否则{
返回数据库.UpdateAsync(coin);
}
}
公共任务DeleteCoinAsync(硬币)
{
返回database.DeleteAsync(coin);
}
好的,尝试以下操作:首先,向coins类添加一个JsonProperty
,将结果映射到正确的属性:
public class Coins
{
[JsonProperty("result")]
public List<Coin> coins { get; set; }
}
公共等级硬币
{
[JsonProperty(“结果”)]
公共列表硬币{get;set;}
}
然后替换代码中的以下两行:
Coins coins = JsonConvert.DeserializeObject<Coin>(content);
var coinItem = (Coins)coins["result"].ToObject<Coins>();
Coins Coins=JsonConvert.DeserializeObject(内容);
var coinItem=(Coins)Coins[“result”].ToObject();
与
Coins Coins=JsonConvert.DeserializeObject(内容);
var coinItem=硬币。硬币[0];
请注意,这将为您提供列表中的第一个硬币-如果您想从列表中的其他位置检索硬币,请更改索引或使用LINQ
我也非常怀疑你的SQLite代码不会做你想做的事情。目前你所有的方法都作用于Coins对象而不是Coin对象。尝试将方法更改为
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);
}
只读SQLiteAsyncConnection数据库;
公共CoinsDatabase(字符串dbPath)
{
数据库=新的SQLiteAsyncConnection(dbPath);
database.CreateTableAsync().Wait();
}
公共任务GetCoinsAsync()
{
返回database.Table().ToListAsync();
}
公共任务GetCoinsAsync(int id)
{
返回database.Table().Where(i=>i.CoinID==id).FirstOrDefaultAsync();
}
公共任务SaveCoinAsync(硬币)
{
如果(coin.CoinID==0){
返回数据库.InsertAsync(co