2017-12-19 1 views
0

에리스트 뷰에서 SQLite는 데이터를 삭제 :아래 그림과 같이 내가 그 데이터를 SQLite는 데이터베이스에서 추출 된 목록보기를 UWP

나는 사용자가 삭제 버튼을 클릭하여 확인 할

는 다음 목록의 데이터가 삭제되고 sqlite 데이터베이스의 데이터도 삭제됩니다. listview image XAML :

<ListView x:Name="ListTryout" Grid.Row="1" Margin="0,5,0,10" ItemsSource="{Binding Source={StaticResource itemsViewSource}}" DataContext="{Binding SelectedItem, ElementName=itemListView}" IsItemClickEnabled="True" SelectionChanged="ListTryout_SelectionChanged" Background="{x:Null}" SelectionMode="Single"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*"/> 
           <ColumnDefinition Width="auto"/> 
          </Grid.ColumnDefinitions> 

          <StackPanel Grid.Column="0" Orientation="Vertical"> 
           <TextBlock Margin="10,10,0,0" FontSize="20" Text="{Binding Judul}" Style="{StaticResource CaptionTextBlockStyle}" VerticalAlignment="Top" HorizontalAlignment="Left"/> 
           <TextBlock Margin="10,10,0,0" FontSize="17" Text="{Binding JumlahSoal}" VerticalAlignment="Top" HorizontalAlignment="Left" FontWeight="SemiLight"/> 
           <TextBlock Margin="10,10,0,0" FontSize="17" Text="{Binding Durasi}" VerticalAlignment="Top" HorizontalAlignment="Left" FontWeight="SemiLight" Visibility="Collapsed"/> 
           <Line X1="0" X2="1" Stretch="Fill" Margin="10,10,10,0" Stroke="#FF4B4B4B"/> 
          </StackPanel> 
          <AppBarButton x:Name="deleteItemBtn" Grid.Column="1" Margin="0,0,50,0" Icon="Delete" HorizontalAlignment="Right" Click="deleteItemBtn_Click"/> 
         </Grid> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 

코드 :

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; 
      } 
     } 
private void deleteItemBtn_Click(object sender, RoutedEventArgs e) 
     { 
      Db_Helper.DeleteQuiz(currentquiz.ID); 
     } 

DatabaseHelper 클래스 :

public void CreateDatabase(string DB_PATH) 
     { 
      if (!CheckFileExists(DB_PATH).Result) 
      { 
       using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DB_PATH)) 
       { 
        conn.CreateTable<DBName>(); 
       } 
      } 
     } 
     private async Task<bool> CheckFileExists(string fileName) 
     { 
      try 
      { 
       var store = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync(fileName); 
       return true; 
      } 
      catch 
      { 
       return false; 
      } 
     } 

     // Insert the new history in the DBName table. 
     public void Insert(DBName dBName) 
     { 
      using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), App.DB_PATH)) 
      { 
       conn.RunInTransaction(() => 
       { 
        conn.Insert(dBName); 
       }); 

      } 
     } 

     public DBName ReadName(int quizid) 
     { 
      using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), App.DB_PATH)) 
      { 
       var existingName = conn.Query<DBName>("select * from DBName where ID =" + quizid).FirstOrDefault(); 
       return existingName; 
      } 
     } 

     public ObservableCollection<DBName> ReadAllDBName() 
     { 
      try 
      { 
       using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), App.DB_PATH)) 
       { 
        List<DBName> myCollection = conn.Table<DBName>().ToList<DBName>(); 
        ObservableCollection<DBName> DBNameList = new ObservableCollection<DBName>(myCollection); 
        return DBNameList; 
       } 
      } 
      catch 
      { 
       return null; 
      } 
     } 

     public void DeleteQuiz(string ID) 
     { 
      using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), App.DB_PATH)) 
      { 

       var existingquiz = conn.Query<DBName>("delete from DBName where ID ='" + ID + "'").FirstOrDefault(); 
       if (existingquiz != null) 
       { 
        conn.RunInTransaction(() => 
        { 
         conn.Delete(existingquiz); 
        }); 
       } 
      } 
     } 

나는 그것을 시도하지만, 데이터가 목록보기에 또한 SQLite는 데이터베이스에서 삭제할 수 없습니다 . 처리 방법은 무엇입니까?

+0

실제 문제는 무엇입니까? 데이터가 여전히 목록보기에서 볼 수 있습니까? 또는 귀하의 DB에서 데이터가 삭제되지 않았습니까? 여기에 붙여 넣은 코드를 보면 db 데이터 만 삭제하는 것을 볼 수 있습니다. 따라서 목록보기는 여전히 데이터를 표시합니다 ... – Depechie

답변

1

설정하거나 ObservableCollection<T>ListViewItemsSource 결합이 하나에서 항목을 제거, 예컨대 :

private ObservableCollecton<DBName> _source; 
private void ReadTryoutList_Loaded(object sender, RoutedEventArgs e) 
{ 
    ReadAllDBName dbName = new ReadAllDBName(); 
    DB_TryoutList = dbName.GetAllDBName(); 
    _source = new ObservableCollecton<DBName>(DB_TryoutList.OrderByDescending(i => i.ID).ToList()); 
    ListTryout.ItemsSource = _source; 
    if (DB_TryoutList.Count == 0) 
    { 
     statuskosongStack.Visibility = Visibility.Visible; 
     ListTryout.Visibility = Visibility.Collapsed; 
    } 
    else 
    { 
     statuskosongStack.Visibility = Visibility.Collapsed; 
     ListTryout.Visibility = Visibility.Visible; 
    } 
} 

private void deleteItemBtn_Click(object sender, RoutedEventArgs e) 
{ 
    var btn = sender as AppBarButton; 
    var item = btn.DataContext as DBName; 
    if (item != null) 
    { 
     _source.Remove(item); 
     Db_Helper.DeleteQuiz(currentquiz.ID); 
    } 
} 

나는 GetAllDBName()IEnumerable<DBName>를 반환하는 것을하고 ListViewDBNames를 표시한다고 가정합니다.

+0

위 코드를 시도했지만 sqlite 데이터베이스의 데이터가 성공적으로 삭제되지 않았습니다. while listview가 지워졌습니다. 따라서 페이지를 종료하고 페이지를 다시 입력하면 sqlite 데이터베이스의 데이터가 성공적으로 삭제되지 않기 때문에 데이터가 여전히 목록보기에 표시됩니다. 어떻게 처리할까요? – Rose

+0

각 빌드에서 데이터베이스를 덮어 쓰지 않으시겠습니까? 출력 디렉토리의 데이터베이스에 기록됩니다. 프로젝트 디렉토리에있는 파일이 아닙니다. – mm8

+0

나는 listview와 sqlite 데이터베이스에서 데이터를 삭제할 수 있었다. 나는 함수를 추가하는 것을 잊었다. 감사 – Rose

관련 문제