我有一个名为ebookstore.db的数据库,如下所示:
我想当JSON上的slug与数据库中的标题不同时,它将显示带有JSON上的slug的数据量,这与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上的slu,然后显示的slug是第一个slug在数据库中重复显示尽可能多的数据,之后在数据库上反复显示第二个slug,等等,如下:
解决方法
问题是你有两个嵌套的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
如您所见,如果数据库中的JSON和M行中有N个项目,则这不可避免地导致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 } }
其他提示
>避免在foreach中调用GetKomikData.此方法没有任何参数,这意味着您只是在没有理由的情况下一次又一次地访问数据库,这会花费时间并显着降低执行速度.相反,在第一个foreach之前只调用一次GetKomikData,然后只使用title变量.>每次集合更改时都不要分配ItemsSource.这将不必要地减慢UI线程,因为它将不得不重新加载每个循环的所有项目.相反,只在外部foreach之后分配属性一次>用一种语言编写代码.当你开始用英语和印尼语混合变量名时,代码变得混乱,可读性降低,增加了认知开销.>避免使用非描述性变量名称,如file1或jsonObject1.变量名称应该是明确的,并告诉您它包含的内容.当最后有一个数字时,通常意味着它可以更清楚地命名.>使用复数列表变量名称 – 而不是标题使用标题