#c# #.net #xamarin #xamarin.forms
#c# #.net #xamarin #xamarin.forms
Вопрос:
В моем приложении Xamarin есть средство выбора, которое получает список банков из базы данных, и эта база данных получает банковские реквизиты через API.
Все работает нормально, но теперь я хочу обновить базу данных, если новые банки будут добавлены в API, я хочу добавить их в существующую базу данных.
Я написал этот небольшой код, но проблема в том, что сначала он выводит все существующие записи из базы данных, а затем печатает новые записи, во много раз больше общего количества записей, например (если есть десять записей, каждая запись будет печататься десять раз).
ViewModel.cs
// Load all Banks into a List
var getBanks = await App.Database.GetBankAsync();
// Update the Bank Details where new Banks doesn't exist in the Database
List<Bank> updateBanks = new List<Bank>();
foreach (Banks i in obj.banks)
{
foreach (var record in getBanks.Where(c => c.Name != i.alias.name))
{
updateBanks.Add(new Bank { Name = i.alias.name, Status = "Not Registered" });
}
}
foreach (var bank in updateBanks)
{
await App.Database.SaveBankAsync(bank);
}
// Load all Banks into a List
var getBanksUpdated = await App.Database.GetBankAsync();
// Load the Banks whose Status is "Not Registered"
foreach (var record in getBanks.Where(c => c.Status == "Not Registered")
{
_bankList.Add(record);
}
public class Alias
{
public string name { get; set; }
}
public class Banks
{
public Alias alias { get; set; }
public string id { get; set; }
}
public class RootObject
{
public List<Banks> banks { get; set; }
}
Получение данных через API
{
success: true,
banks: [
{
alias: {
name: "Bank 1",
Address: "Earth"
},
endpoint: {
uri: "http://127.0.0.1:0000"
},
state: "Registered",
createdAtUtc: "2021-01-19T13:55:12.2318662",
updatedAtUtc: "2021-01-19T13:55:14.9944042"
},
]
}
Код для получения данных из API
HttpClient httpClient = new HttpClient(new NativeMessageHandler());
Uri getDataBanks = new Uri(string.Format("http://127.0.0.1:0000/Banks"));
HttpResponseMessage restponseBanks = await httpClient.GetAsync(getDataBanks);
string contentBanks = await restponseBanks.Content.ReadAsStringAsync();
RootObject obj = JsonConvert.DeserializeObject<RootObject>(contentBanks);
Ответ №1:
// get the names of all existing banks
List<string> names= obj.banks.Select(u => u.Name).ToList();
// get the names of all banks taken from the API
List<string> names_new= getBanks.Select(u => u.Name).ToList();
foreach (var record in names_new)
{
//check if the bank is exists or not
if(! names.contains(record)
{
updateBanks.Add(new Bank { Name = record.alias.name, Status = "Not Registered" });
}
}
Ответ №2:
Я не в курсе ваших данных, но у вас слишком много циклов foreach, и вы проверяете всю коллекцию в каждом цикле. Таким образом, возможно, что ваше условие улавливает каждую учетную запись в каждом цикле.
Комментарии:
1. это утверждение — то, которое должно добавить новые записи в существующую базу
foreach (var record in getBanks.Where(c => c.Name != i.alias.name))
данных .. но вопрос в том, как вы это сделаете? или каков правильный способ добиться этого?2. нет, вы проверяете каждый псевдоним в каждом цикле … и a!= b a!= c a!=a итак, я думаю, в этом проблема. И, к сожалению, я понятия не имею, как этого добиться, тогда вам нужно уточнить свой вопрос и предоставить дополнительную и подробную информацию о ваших данных
3. Я опубликовал формат данных, который я получаю через api .. пожалуйста, посмотрите 🙂
4. хорошо, я борюсь с вашими объектами, которые вы используете
obj
, из которых я не знаю, что это такое 🙂 Я думаю, что это коллекция «не зарегистрированных» банков. итак, перед добавлением этого банка вы можете проверить, является ли этот банк уже частьюupdateBanks
объекта, и добавлять только в том случае, если нет записи5. Я опубликовал приведенный выше код для получения данных из api..