【问题标题】:Delete sqlite data in listview on uwp在 uwp 上的 listview 中删除 sqlite 数据
【发布时间】:2018-06-01 17:24:13
【问题描述】:

我有一个listview,它的数据是从sqlite数据库中提取出来的,如下图:

我想检查用户点击删除按钮,然后列表中的数据被删除,sqlite数据库中的数据也被删除。 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);
                    });
                }
            }
        }

我试过了,但是listview和sqlite数据库上的数据都不能删除。 如何处理?

【问题讨论】:

  • 实际问题是什么?数据在列表视图中仍然可见吗?或者数据没有在您的数据库中删除?因为看这里粘贴的代码,我们只看到你删除了 db 数据。因此列表视图仍将显示数据...

标签: c# sqlite listview uwp


【解决方案1】:

ListViewItemsSource 设置或绑定到ObservableCollection&lt;T&gt; 并从中删除该项目,例如:

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&lt;DBName&gt; 并且您在 ListView 中显示 DBNames

【讨论】:

  • 我试过上面的代码,但是sqlite数据库上的数据没有成功删除。在列表视图上删除。所以如果我退出页面再进入页面,数据仍然显示在listview上,因为sqlite数据库上的数据没有成功删除。如何处理?
  • 您确定没有在每次构建时都覆盖数据库吗?写入的是输出目录中的数据库。不是您项目目录中的那个。
  • 我已经设法删除了 listview 和 sqlite 数据库中的数据。我忘了添加一个功能。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2015-11-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多