Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Json输出保存到c#中的SQLite数据库?_C#_Json_Sqlite_Xamarin_Xamarin.forms - Fatal编程技术网

如何将Json输出保存到c#中的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

我正在尝试用xamarin表单制作一个应用程序,从bittrex获取信息,然后将其放入模型中,然后将其保存到本地SQLite数据库中

以下是我将内容保存到数据库的代码:

    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