我的android项目中有一个sql lite数据库,它从一个提供JSON的Web服务中获取数据。 JSON很直接,没有标签。它只是具有与数据库中的表相同的字段顺序的表数据行。
JSON
[["123","ny","45"],
["456","nj","76"],
["778","ca","33"]]
SQL Lite客户表CustomerID,State,NumofItems
如何将其导入数据库而不会为每个表等创建类的开销。一些表有超过50个字段。
如果它以某种方式使事情变得更容易,我正在使用Xamarin
答案 0 :(得分:0)
这取决于without a lot of coding
的含义以及填充的行数; - )
使用dynamics
和Json.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
来提供SQLiteConnection
,CreateCommand
和交易,这是在ESink SQLitePCL.raw
之上,相应调整...... < / p>