【问题标题】:How to retrieve data from Autosuggestbox with SQlite?如何使用 SQlite 从 Autosuggestbox 中检索数据?
【发布时间】:2017-07-16 06:39:37
【问题描述】:

我创建了一个 SQLite 数据库,但问题是当键入它时会阻塞,我没有得到任何数据并离开应用程序。这是我第一次使用数据库。我粘贴了一个代码片段。

Public NotInheritable Class METARTAF
Inherits Page
Dim dbpath As String
Dim conn As SQLiteConnection

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()
    'Ubicación de la base de datos
    dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "airportsdb.sqlite3")
    'Conexión a la base de datos
    conn = New SQLiteConnection(New WinRT.SQLitePlatformWinRT(), dbpath)
End Sub

Private Sub AutoSuggestBox_TextChanged(sender As AutoSuggestBox, args As AutoSuggestBoxTextChangedEventArgs)
    Dim result = conn.Query(Of airports)("select * from airports where name ").FirstOrDefault()
    If args.Reason = AutoSuggestionBoxTextChangeReason.UserInput Then
        If sender.Text.Length > 1 Then
            sender.ItemsSource = result
        End If
    Else
        sender.ItemsSource = "No results..."
    End If
End Sub

【问题讨论】:

    标签: sqlite uwp windows-phone autosuggest


    【解决方案1】:

    想到两个解决方案

    1. 使用 SQLite 的异步版本,它应该有助于阻止
    2. 或者更好的是,在页面显示时将你搜索的所有机场加载到内存中的一个列表中,并在这个列表中搜索它们,而不是直接调用 SQLite

    【讨论】:

      【解决方案2】:

      如果您使用的是同步 SQLite api,您可以将 Query 方法包装在 Task.Run 中。在 Run 中包装您的逻辑将使您的代码在后台线程中运行。 由于 TextChanged 处理程序在 UI 线程中运行,因此您执行的任何长时间运行的操作都会阻塞 UI 线程并最终冻结应用程序。

      正如 Igor 所建议的,您可以使用 SQLite 的异步 API。这些 API 将在后台线程中运行。您唯一应该考虑的不是直接更新您的 ItemsSource。任何在后台线程更新UI线程的操作都会引发异常。

      如果你的 'airports' 表没有大数据,你应该将它们提取到内存中并保存在那里,当你想要查询它时,而不是每次你应该从内存中获取它们时都去 SQLite

      p>

      直接设置您的 ItemsSource 不会更新视图。您真的应该查找 ObservableCollection。如果您想在获取数据时更新视图,您必须先将 ItemsSource 设置为 null,然后再将其设置为数据。

      【讨论】:

        猜你喜欢
        • 2020-11-14
        • 2019-02-21
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多