UWP - сравнение данных в JSON и базе данных

У меня есть база данных ebookstore.db, как показано ниже: UWP - сравнение данных в JSON и базе данных

и JSON, как показано ниже: UWP - сравнение данных в JSON и базе данных

Я хочу, чтобы ярлык в JSON не совпадает с заголовком в базе данных, он будет отображать объем данных с ярлыком в JSON, который не совпадает с заголовком в базе данных в ukomikText.

Код:

    string judulbuku;
     try
     {
        string urlPath1 = "https://...";
        var httpClient1 = new HttpClient(new HttpClientHandler());
        httpClient1.DefaultRequestHeaders.TryAddWithoutValidation("KIAT-API-KEY", "....");
        var values1 = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("halaman", 1),
            new KeyValuePair<string, string>("limit", 100),
        };

         var response1 = await httpClient1.PostAsync(urlPath1, new FormUrlEncodedContent(values1));
         response1.EnsureSuccessStatusCode();

        if (!response1.IsSuccessStatusCode)
        {
            MessageDialog messageDialog = new MessageDialog("Memeriksa update Komik gagal", "Gangguan Server");
            await messageDialog.ShowAsync();
        }
        string jsonText1 = await response1.Content.ReadAsStringAsync();
        JsonObject jsonObject1 = JsonObject.Parse(jsonText1);
        JsonArray jsonData1 = jsonObject1["data"].GetArray();

        foreach (JsonValue groupValue in jsonData1)
        {
            JsonObject groupObject = groupValue.GetObject();

            string id = groupObject["id"].GetString();
            string judul = groupObject["judul"].GetString();
            string slug = groupObject["slug"].GetString();

            BukuUpdate file1 = new BukuUpdate();
            file1.ID = id;
            file1.Judul = judul;
            file1.Slug = slug;

            List<String> title = sqlhelp.GetKomikData();
            foreach (string juduldb in title)
            {
                judulbuku = juduldb.Substring(juduldb.IndexOf('.') + 1);
                if (judulbuku != file1.Slug.Replace("-", "_") + ".pdf")
                {
                    BukuData.Add(file1);
                    ListBuku.ItemsSource = BukuData;
                }
                else
                {
                    ukomikText.Text = "belum tersedia komik yang baru";
                    ukomikText.Visibility = Visibility.Visible;
                }
            }
        }
        if (ListBuku.Items.Count > 0)
        {
            ukomikText.Text = BukuData.Count + " komik baru";
            ukomikText.Visibility = Visibility.Visible;
            jumlahbuku = BukuData.Count;
        }
        else
        {
            ukomikText.Text = "belum tersedia komik yang baru";
            ukomikText.Visibility = Visibility.Visible;
        }

 public static List<String> GetKomikData()
        {
            List<String> entries = new List<string>();

            using (SqliteConnection db =
                new SqliteConnection("Filename=ebookstore.db"))
            {
                db.Open();
                SqliteCommand selectCommand = new SqliteCommand
                    ("SELECT title FROM books where folder_id = 67", db);
                SqliteDataReader query = selectCommand.ExecuteReader();
                while (query.Read())
                {
                    entries.Add(query.GetString(0));
                }
                db.Close();
            }
            return entries;
        }

BukuUpdate.cs:

public string ID { get; set; }
public string Judul { get; set; }
public string Slug { get; set; }

У меня проблема, то есть при проверке ярлыков в JSON, тогда отображаемый ярлык - это первый ярлык, который отображается повторно, как много данных в базе данных, после этого показывать второй ярлык повторно, как много данных в базе данных, и т. д. , как показано ниже: UWP - сравнение данных в JSON и базе данных

Как решить эту проблему, чтобы слаг в JSON не отображался повторно (в зависимости от количества данных в JSON)?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что у вас есть две вложенные петли foreach. Что делает код в упрощенном псевдокоде:

For each item in JSON
   Load all rows from DB
   And for each loaded row
      Check if the current JSON item matches the row from DB and if not, output

Как видите, если у вас есть элементы N в строках JSON и M в базе данных, это неизбежно приводит к строкам вывода N*M, за исключением тех редких, где элемент JSON соответствует определенной строке в базе данных.

Если я правильно понимаю, я предполагаю, что вместо этого вы хотите проверить, есть ли строка, соответствующая элементу JSON, и, если нет, выведите ее. Вы можете сделать это следующим образом:

List<String> title = sqlhelp.GetKomikData();
HashSet<string> dbItems = new HashSet<string>();
foreach (string juduldb in title)
{
    judulbuku = juduldb.Substring(juduldb.IndexOf('.') + 1);
    dbItems.Add( judulbuku );
}

...

foreach ( JsonValue groupValue in jsonData1 )
{
    ...

    //instead of the second foreach

    if ( !dbItems.Contains( file1.Slug.Replace("-", "_") + ".pdf" ) )
    {
         //item is not in database
    }
    else
    {
         //item is in database
    }
}

Дополнительные советы

  • Избегайте вызова GetKomikData внутри foreach. Этот метод не имеет аргументов, а это означает, что вы снова и снова обращаетесь к базе данных без причины, что требует времени и значительно замедляет выполнение. Вместо этого вызовите GetKomikData только один раз перед первым foreach, а затем просто используйте переменную title.
  • Не назначайте ItemsSource каждый раз при изменении коллекции. Это излишне замедлит поток пользовательского интерфейса, так как ему придется перезагружать все элементы с каждым циклом. Вместо этого присвойте свойство только один раз после внешнего foreach.
  • напишите свой код на одном языке. Когда вы начинаете смешивать имена переменных на английском с индонезийским, код становится запутанным, менее читаемым и добавляет когнитивные издержки.
  • избегайте неописательных имен переменных, таких как file1 или jsonObject1. Имя переменной должно быть четким и сообщать вам, что оно содержит. Когда в конце стоит число, это обычно означает, что его можно назвать более понятным.
  • используйте множественное число для имен переменных списка - вместо title используйте titles

Другие вопросы по теме