UWP-比较JSON和数据库上的数据

时间:2018-07-12 04:11:59

标签: c# json database uwp

我有一个名为ebookstore.db的数据库,如下所示: database

和JSON如下: JSON

我想要当JSON上的数据块与数据库中的标题不同时,它将显示uk上的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上检查段时,显示的段是第一个段重复显示的数据库中数据的数量,此后重复显示第二个段重复的数据库数据,依此类推,如下所示: result

如何解决该问题,以便不会重复显示JSON上的slug(根据JSON上的数据量)?

1 个答案:

答案 0 :(得分: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

如您所见,如果您在JSON中有N个项目,并且在数据库中有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。这将不必要地减慢UI线程的速度,因为它必须在每个循环中重新加载所有项目。相反,仅在外部foreach
  • 之后分配属性一次
  • 用一种语言编写代码。当您开始将英语中的变量名与印度尼西亚语混合使用时,代码会变得混乱且难以理解,并增加了认知开销。
  • 避免使用非描述性的变量名,例如file1jsonObject1。变量名称应该清楚,并告诉您变量名。当末尾有数字时,通常意味着可以更清楚地命名它。
  • 使用复数形式表示列表变量名称-代替title使用titles