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

Я хочу, чтобы ярлык в 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, тогда отображаемый ярлык - это первый ярлык, который отображается повторно, как много данных в базе данных, после этого показывать второй ярлык повторно, как много данных в базе данных, и т. д. , как показано ниже:

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





Проблема в том, что у вас есть две вложенные петли 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