2017-12-15 13 views
0

sqlite 데이터베이스의 데이터를 가진 listview가 있습니다. 사용자가 JSON에서 가져온 데이터를 가진 이전 페이지에서 목록을 선택하면 데이터베이스가 작성됩니다. 코드 : 제가하는 데 문제가데이터가 uwp의 sqlite에 성공적으로 저장 될 때 listview의 데이터 양을 늘립니다.

ConnectionProfile connections = NetworkInformation.GetInternetConnectionProfile(); 
      if (connections != null && connections.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess) 
      { 
       loading.IsIndeterminate = true; 

       try 
       { 
        string urlPath = "https://.../tryout_perid"; 
        var httpClient = new HttpClient(new HttpClientHandler()); 

        var values = new List<KeyValuePair<string, string>> 
        { 
         new KeyValuePair<string, string>("tid", ((App)(App.Current)).ID) 
        }; 

        var response = await httpClient.PostAsync(urlPath, new FormUrlEncodedContent(values)); 
        response.EnsureSuccessStatusCode(); 

        if (!response.IsSuccessStatusCode) 
        { 
         loading.IsIndeterminate = false; 
         RequestException(); 
        } 
        string jsonText = await response.Content.ReadAsStringAsync(); 
        JsonObject jsonObject = JsonObject.Parse(jsonText); 
        JsonArray jsonData = jsonObject["data"].GetArray(); 

        foreach (JsonValue groupValue1 in jsonData) 
        { 
         JsonObject groupObject2 = groupValue1.GetObject(); 
         string id = groupObject2["id"].GetString(); 
         string title = groupObject2["judul"].GetString(); 

         QuizHome quiz = new QuizHome(); 
         quiz.ID = id; 
         ((App)(App.Current)).ID = quiz.ID.ToString(); 
         quiz.Title = title; 
         quizDataSource.Add(quiz); 

         if (quizDataSource.Count > 0) 
         { 
          string InsertQuiz = @"INSERT INTO DBName (ID,Judul) SELECT '" + id.ToString() + "','" + title.ToString() + "','" + "' WHERE not exists " + 
           "(select ID and Judul FROM DBName WHERE ID='" + id.ToString() + "' and Judul='" + title.ToString() + "')"; 
          var quizName = objConn.Prepare(InsertQuiz); 
          quizName.Step(); 
         } 

         JsonArray jsonDataSoal = groupObject2["list_soal"].GetArray(); 
         foreach (JsonValue groupValueSoal in jsonDataSoal) 
         { 
          JsonObject groupObjectSoal = groupValueSoal.GetObject(); 

          string qid = groupObjectSoal["qid"].GetString(); 
          string pertanyaan = groupObjectSoal["question"].GetString(); 

          QuizQuestion question = new QuizQuestion(); 
          question.QID = qid; 
          question.Pertanyaan = pertanyaan; 
          questionDataSource.Add(question); 

          if (questionDataSource.Count > 0) 
          { 
           string InsertQuestion = @"INSERT INTO DBQuestion (QID,Pertanyaan) SELECT '" + qid.ToString() + "','" + pertanyaan.ToString() + "' WHERE not exists " + 
            "(select QID and Pertanyaan FROM DBQuestion WHERE OID='" + qid.ToString() + "' and Pertanyaan='" + pertanyaan.ToString() + "')"; 
           var quizQuestion = objConn.Prepare(InsertQuestion); 
           quizQuestion.Step(); 
          } 

          JsonArray jsonDataOption = groupObjectSoal["jawaban"].GetArray(); 
          foreach (JsonValue groupValueOption in jsonDataOption) 
          { 
           JsonObject groupObjectOption = groupValueOption.GetObject(); 

           string oid = groupObjectOption["oid"].GetString(); 
           string option = groupObjectOption["q_option"].GetString(); 
           string score = groupObjectOption["score"].GetString(); 

           QuizOption pilihan = new QuizOption(); 
           pilihan.OID = oid; 
           pilihan.Option = option; 
           optionDataSource.Add(pilihan); 

           if (optionDataSource.Count > 0) 
           { 
            string InsertOption = @"INSERT INTO DBOption (OID,Option) SELECT '" + oid.ToString() + "','" + option.ToString() + "','" + "' WHERE not exists " + 
             "(select OID and Option FROM DBOption WHERE OID='" + oid.ToString() + "' and Option='" + option.ToString() + "')"; 
            var quizOption = objConn.Prepare(InsertOption); 
            quizOption.Step(); 
           } 
          } 
         } 
         this.Loaded += ReadTryoutList_Loaded; 
         loading.IsIndeterminate = false; 
        } 
       } 

private void ReadTryoutList_Loaded(object sender, RoutedEventArgs e) 
     { 
      ReadAllDBName dbName = new ReadAllDBName(); 
      DB_TryoutList = dbName.GetAllDBName(); 
      ListTryout.ItemsSource = DB_TryoutList.OrderByDescending(i => i.ID).ToList();//Binding DB data to LISTBOX and Latest contact ID can Display first. 
      if (DB_TryoutList.Count == 0) 
      { 
       statuskosongStack.Visibility = Visibility.Visible; 
       ListTryout.Visibility = Visibility.Collapsed; 
      } 
      else 
      { 
       statuskosongStack.Visibility = Visibility.Collapsed; 
       ListTryout.Visibility = Visibility.Visible; 
      } 
     } 

사용자가 이전 페이지에서 목록을 선택하고 데이터가 성공적으로 데이터베이스에 저장되지만,리스트 뷰에있는 데이터의 양이 증가하지 않는 경우, 즉. 뒤로 버튼을 클릭하고이 페이지에 다시 입력하면 목록보기의 데이터가 증가합니다. 데이터가 성공적으로 저장 될 때 데이터 수를 증가 시키려면 어떻게해야합니까?

+0

데이터를로드하고 새 페이지의'OnNavigatedTo' 메소드에서'ListTryout.ItemsSource'를 데이터에 다시 할당 해 주시겠습니까? 여전히이 문제가있는 경우 문제를 해결하기 위해 간단한 재생산 샘플을 사용하는 것이 좋습니다. –

+0

@Breeze 지연에 대응하여 죄송합니다. 여기 프로젝트 샘플 : https://1drv.ms/u/s!Assf-w0FVKyxgQM0acVWm5WvPXJe TryoutLibrary1 페이지의 문제점 – Rose

답변

0

이 문제는 코드의 비동기 메서드 때문에 발생합니다. 항목을 클릭하면 TryoutLibrary1 페이지로 이동합니다. 이 페이지에서 데이터베이스에 데이터를 저장하는 한편 Page.Loaded 이벤트의 데이터베이스에서 데이터 소스를 가져옵니다. 그러나 데이터를 가져올 때 클릭 한 항목이 데이터베이스에 삽입되지 않아 데이터를 다시로드 (페이지를 다시 다시 입력) 할 때까지 페이지에 표시되지 않습니다.

ItemClick 이벤트에서 다시 논리를 재고해야 데이터가 데이터베이스에 저장되었는지 확인한 다음 데이터를 가져 와서 ListView.ItemsSource으로 설정해야합니다. 예를 들어 항목을 클릭하면 개체를 만들어 로컬 ObservableCollection 개체에 넣은 다음 ObservableCollection을 ListView itemsSource로 설정하여 UI에 표시하고 다른쪽에 항목을 저장하면됩니다. 데이터 베이스.