Поскольку ваш json - это просто массив объектов, цикл foreach не нужен, и вы можете просто указать, что результат декодирования должен быть массивом News
, указав тип результата в квадратных скобках: [News].self
[116 ]
guard let news = try? JSONDecoder().decode([News].self, from: Data(jsonNews.utf8)) else {
debugPrint("An error has occurred")
return
}
debugPrint(news)
arrayNews = news
Кроме того, если нет конкретной причины, по которой ваша модель должна наследоваться от NSObject
, вы можете упростить ее, сделав ее struct
. Также вам не нужны значения по умолчанию, так как все значения будут назначаться инициализатором декодера
struct News: Decodable {
let idPlace, namePlace, dateMsg, msg, urlPicture: String
}
В зависимости от того, сколько строк Вы имеете в DataSet, вероятно, лучшая вещь сделать состояла бы в том, чтобы использовать SqlCommandBuilder, как так:
var connection = new SqlConnection("my connection string");
connection.Open();
// repeat for each table in data set
var adapterForTable1 = new SqlDataAdapter("select * from table1", connection);
var builderForTable1 = new SqlCommandBuilder(adapterForTable1);
adapterForTable1.Update(myDataSet, "Table1");
Если Вам определили сложные отношения между таблицами в DataSet, я боюсь, что Вы не можете использовать SqlCommandBuilder. То, что необходимо будет сделать, вместо этого, определяют адаптер данных для каждой таблицы в DataSet. Затем обновите таблицы в DataSet в порядке зависимости (т.е. сделайте таблицы без зависимостей сначала, затем зависимые таблицы).
Вот пример родительской/дочерней вставки (обратите внимание, что Вы сделали бы подобные вещи для обновлений). Table1 является родителем и имеет ParentId (столбец идентификационных данных), и поле NVARCHAR ParentValue. Table2 является ребенком, имеет его собственный столбец идентификационных данных (ChildId), поле внешнего ключа (ParentId) и его собственное значение (ChildValue).
var myDataSet = new DataSet();
// ** details of populating the dataset omitted **
// create a foreign key relationship between Table1 and Table2.
// add a constraint to Table2's ParentId column, indicating it must
// existing in Table1.
var fk = new ForeignKeyConstraint("fk", myDataSet.Tables["Table1"].Columns["ParentId"], myDataSet.Tables["Table2"].Columns["ParentId"])
{
DeleteRule = Rule.Cascade,
UpdateRule = Rule.Cascade
};
myDataSet.Tables["Table2"].Constraints.Add(fk);
myDataSet.EnforceConstraints = true;
var connection = new SqlConnection("my connection string");
var adapterForTable1 = new SqlDataAdapter();
adapterForTable1.InsertCommand =
new SqlCommand("INSERT INTO MasterTable (ParentValue) VALUES (@ParentValue); SELECT SCOPE_IDENTITY() AS ParentId", connection);
adapterForTable1.InsertCommand.Parameters.Add("@ParentValue", SqlDbType.NVarChar).SourceColumn = "ParentValue";
var adapterForTable2 = new SqlDataAdapter();
adapterForTable2.InsertCommand =
new SqlCommand("INSERT INTO ChildTable (ParentId, ChildValue) VALUES (@ParentId, @ChildValue); SELECT SCOPE_IDENTITY() AS ChildId", connection);
adapterForTable2.InsertCommand.Parameters.Add("@ParentId", SqlDbType.Int).SourceColumn = "ParentId";
adapterForTable2.InsertCommand.Parameters.Add("@ChildValue", SqlDbType.NVarChar).SourceColumn = "ChildValue";
connection.Open();
adapterForTable1.Update(myDataSet, "Table1"); // insert rows in parent first
adapterForTable2.Update(myDataSet, "Table2"); // child second
Вы, вероятно, хотите посмотреть на DataAdapters и TypedDatasets.
Они все доступны через разработчика VS, просто создают набор данных и отбрасывают таблицы SQL в от представления проводника сервера. :) (или что-то как этот, это было некоторое время),
Если DataTables и Таблицы SQL выстраиваются в линию, то быстрым путем является SqlBulkCopy.
При использовании.NET 3/3.5 Вы могли бы изучить LINQ.