Android将原始JSON导入数据库而无需大量编码

时间:2017-05-21 23:28:46

标签: android json sqlite xamarin xamarin.android

我的android项目中有一个sql lite数据库,它从一个提供JSON的Web服务中获取数据。 JSON很直接,没有标签。它只是具有与数据库中的表相同的字段顺序的表数据行。

JSON
[["123","ny","45"],
["456","nj","76"],
["778","ca","33"]]

SQL Lite客户表CustomerID,State,NumofItems

如何将其导入数据库而不会为每个表等创建类的开销。一些表有超过50个字段。

如果它以某种方式使事情变得更容易,我正在使用Xamarin

1 个答案:

答案 0 :(得分:0)

这取决于without a lot of coding的含义以及填充的行数; - )

使用dynamicsJson.Net,您可以使用DeserializeObject获取动态数组并循环遍历这些数组元素,并构建一个绕过列名和类/模型定义的SQL Insert语句每个表...使用dynamics速度较慢,但​​除非您每次导入/应用程序启动时填充十万行/ ....这样工作正常......

这就是我在一个非常像你的情况下填充一堆表的方法来导入数字序列以在RecyclerView / CardViews中绘制SparkLines,我删除了错误检查以简化答案:

Batteries_V2.Init();
var sqlConn = new SQLiteConnection("foobar.db");
sqlConn.CreateCommand("create table Customer (CustomerID INT PRIMARY KEY NOT NULL, State TEXT NOT NULL, NumofItems INT NOT NULL)").ExecuteNonQuery();

var jsonString = @"
    [[""123"",""ny"",""45""],
    [""456"",""nj"",""76""],
    [""778"",""ca"",""33""]]"
    ;
dynamic jsonResponse = JsonConvert.DeserializeObject(jsonString);

sqlConn.BeginTransaction();
foreach (var item in jsonResponse)
{
    string aBunchOfValues = "";
    var noOfColumns = item.Count;
    for (int i = 0; i < noOfColumns; i++)
    {
        var isString = !((string)item[i]).TryParse(out float n);
        aBunchOfValues += $"{(isString ? '"' : ' ')}{item[i]}{(isString ? '"' : ' ')} {(i < noOfColumns - 1 ? ',' : ' ')}";
    }
    var sqlInsertString = $"INSERT INTO Customer VALUES ({aBunchOfValues});";
    sqlConn.CreateCommand(sqlInsertString).ExecuteNonQuery();
}
sqlConn.Commit();

注意:这是使用FKrueger的sqlite-net来提供SQLiteConnectionCreateCommand和交易,这是在ESink SQLitePCL.raw之上,相应调整...... < / p>