首页 > 解决方案 > 从 JSON 对象数组迭代和插入到 sqlute db 的最佳实践

问题描述

我正在从 Web 服务调用返回压缩数据,该调用返回一个 json 数组,该数组中填充了具有键/值对数组的对象。其中一些可能会或可能不会作为空对象返回,这很好。只是意味着没有更新。

解压后我的 json 对象以这种格式返回:

{
 "Warehouse":[[]],
 "Managers":[{"ID":"12404","EmployeeID":"4776","Name":"Sammy Silver"},   {"ID":"12405","EmployeeID":"4778","Name":"Tom Castro"} ],
 "T1":[{"ID":"60458","EmployeeID":"25902","Name":"Angela Li"}...,...,]
"DeletedWarehouse" : [{"ID":"70141","EmployeeID":"12345","Name":"Victor Bajas"}...,...]

我的代码如下所示:

 var jsonList = JsonConvert.DeserializeObject<Root>(response.Content.ReadAsStringAsync().Result);

我的根:

public class Root
    {
        public List< Warehouse > Warehouse { get; set; }
        public List< Management > Managers { get; set; }
        public List< Top > T1 { get; set; }
        public List< Warehouse > DeletedWarehouse { get; set; }
    }

我想更新被视为已更新的行,例如仓库、经理和 T1。仓库是空的..所以那里什么都不会发生,但其余的我正在尝试遍历它们以运行对我的本地数据库的查询。但是我儿子认为我这样做不正确。我想我重复自己太多了,我不想那样做,但我想不出不同的方式。

if(jsonList.Warehouse.Count > 0)
     {
         //loop and  insert or replace here..
     }
     if(jsonList.Managers.Count > 0)
     {
      //loop and  insert or update
     }
     if(jsonList.T1.Count > 0)
     {
      //loop and  insert or update
     }
     if(jsonList.DeletedWarehouse.Count > 0)
     {
       //loop and delete from table
     }

我正在使用一个 dbmaanger 类来存储我所有的 sqlite 交互,所以我将创建一个函数,我可以在其中插入、替换或删除所有行。但在我这样做之前,我想看看我上面的逻辑是好的。

谢谢。

标签: jsonsqlitexamarin.forms

解决方案


我想更新被视为已更新的行,例如仓库、经理和 T1。仓库是空的..所以那里什么都不会发生,但其余的我正在尝试遍历它们以运行对我的本地数据库的查询。

可以foreach jsonList,通过id查找数据库中的当前数据,如果是,就更新,如果不是,插入。

public  class SQLiteHelper
{
    SQLiteAsyncConnection db;
    public SQLiteHelper(string dbPath)
    {
        db = new SQLiteAsyncConnection(dbPath);
        //db.CreateTableAsync<Person>().Wait();
        db.CreateTableAsync<Managers>().Wait();
    }

    //Insert and Update new record  
    public Task<int> SaveItemAsync(Managers person)
    {
        if (person.ID != null)
        {
            return db.UpdateAsync(person);
        }
        else
        {
            return db.InsertAsync(person);
        }
    }

   
}

 SQLiteHelper db;
    private void btn1_Clicked(object sender, EventArgs e)
    {
         db = new SQLiteHelper(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "XamarinSQLite.db3"));
    }

    private void btn2_Clicked(object sender, EventArgs e)
    {
        if (jsonList.Managers.Count > 0)
        {
            foreach(Managers item in jsonList.Managers)
            {
                db.SaveItemAsync(item);
            }
        }
    }

推荐阅读