【问题标题】:UWP PreLoaded SQLiteUWP 预加载 SQLite
【发布时间】:2018-04-27 20:11:11
【问题描述】:

我正在尝试将预加载的 SQLite 数据库复制到我的 UWP 应用程序中。在初始安装时,它会复制“test.db”,但大小为 0 字节,并且没有表或数据。原始数据库为 1300 字节,包含数据和表格。

另一个事实...当我使用 Visual Studio 2017 创建应用程序并编译和运行/调试应用程序时,它工作正常,但是当我旁加载 appx 文件或从 Windows 应用商店下载时,数据库为空。

这是我正在使用的代码:

  Task task = CopyDatabase();


 private async Task CopyDatabase()
    {
        bool isDatabaseExisting = false;

        try
        {
            StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync("Express.db");
            isDatabaseExisting = true;
        }
        catch
        {
            isDatabaseExisting = false;
        }

        if (!isDatabaseExisting)
        {
            StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync("Express.db");
            await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder, "Express.db", NameCollisionOption.ReplaceExisting);
        }
    }

我没有收到任何错误消息。

【问题讨论】:

  • 我无法回答我的头顶但有一些事情要尝试:分配“databaseFile”后创建一个 StorageFile 选项对象并在运行时使用断点检查文件大小。看到它是 0 或 1300 字节。另外,不要将其复制到 LocalFolder,而是尝试在 LocalFolder 中创建一个子文件夹并将其复制到那里。
  • 您何时调用CopyDatabase 方法?在“App.xaml.cs”OnLaunched 处理程序中?
  • 我在 public MainPage() public MainPage() { gui = this; 中调用“CopyDatabase”初始化组件();任务task = CopyDatabase();数据设置(); CreateNewChartButton.Visibility = Visibility.Collapsed; SignInButton_Click(null, null); }

标签: sqlite uwp windows-store-apps


【解决方案1】:

您的数据库文件是否正确部署到目标系统? 要确认它,请查看您部署的 - “Package” - 文件夹。使用管理权限打开命令提示符,然后查看目录

c:\Program Files\WindowsApps\your-app-id

如果您的数据库文件部署成功,您可以在目录中看到它。如果没有,您可能需要更改部署设置。

要将文件部署到目标机器,您应该将文件的属性设置为...

'BuildAction=Contents'

'复制到输出目录'='始终复制'

您可以从解决方案资源管理器中设置它并右键单击您的数据库文件。

如果您成功部署文件,您的代码会将您的数据库文件复制到应用本地文件夹。

c:\Users\YOUR-USER-ID\AppData\Local\Packages\YOUR-APP-ID\LocalState

【讨论】:

  • 我的构建操作是 "Content" ,但我将 Copy to Output 设置为 "Copy If Newer"。我将更改为“Caopy Always”。我想知道它是否仅在安装时或运行时复制。我正在寻找答案。
【解决方案2】:

首先,您需要将await 用于您的CopyDatabase 方法。

其次,我建议你在MainPage_Loaded事件处理函数中调用这个方法,而不是在MainPage的构造函数中调用。

public MainPage()
{
    this.InitializeComponent();
    this.Loaded += MainPage_Loaded;
}

private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    gui = this; InitializeComponent(); 
    await CopyDatabase(); 
    DataSetup(); 
    CreateNewChartButton.Visibility = Visibility.Collapsed; 
    SignInButton_Click(null, null); 
}

【讨论】:

  • 仍然没有一致地加载预填充的数据库。无论是数据被预加载还是我必须求助于实用程序按钮来手动预加载数据,这都是一个命中或未命中的命题。
  • @TreyBalut 很奇怪。请上传一个简单的可重现代码示例。这样我们就可以在内部调查这个问题。您不必发送项目的完整源代码。我们只需要一个最简单的样本来重现问题。您可以从中删除任何机密信息或业务逻辑。
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 2018-01-18
  • 2019-01-14
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多