在UWP应用中包含带有数据的SQLite数据库文件

3

我试图将一个SQLite文件与UWP应用程序一起使用。SQLite文件中有多个包含数据的表。

目前该数据库是只读的,我计划使用EF Core来访问数据。

因此我有两个问题:

  1. 将该文件与应用程序捆绑的正确方法是什么?
  2. 如何组合文件路径以从UWP应用程序访问该文件?

将.sqlite文件的“拷贝到输出目录”设置为“始终复制”似乎将文件复制到bin文件夹中,但我似乎无法找出访问它的路径。将SQLite连接字符串设置为“Filename = databasename.sqlite”时,它似乎会在其他地方创建一个空DB文件,当尝试访问任何表时抛出“未找到表”的异常。

谢谢!

2个回答

6

我的建议是...

  1. 将.db文件包含到你的AppX包中。要包含它,需要将.db文件添加到项目的Assets文件夹中。
  2. 然后,在你的应用程序首次启动时,你应该将.db文件从Assets复制到你的应用程序的本地文件夹中。因为SQLite本身无法访问Assets文件夹。它只能访问你的应用程序的本地或临时文件夹。

我已经在MSDN论坛上回答了类似的问题,请也参考一下。

[UWP] SQLite.net Path question?


3
感谢你回复!我发现一个问题:你需要将构建操作设置为“内容”以便于将数据库文件复制到输出的AppX文件夹中,即使它在项目的资产文件夹中也无法复制。请注意不要改变原意。 - Nick Goloborodko

1

基于@Mamoru Satoh的链接回答,对我有用的是:

在资产文件夹中,我将数据库扩展名更改为.png,否则无法复制,然后在目标地点,数据库名称扩展名为.db。

    public async Task getDataBase()
    {
        StorageFile dbFile = (StorageFile) await ApplicationData.Current.LocalFolder.TryGetItemAsync("TestDb.db");
        try
        {
            if (null == dbFile)
            {
                // first time ... copy the .db file from assets to local  folder
                var localFolder = ApplicationData.Current.LocalFolder;
                var originalDbFileUri = new Uri("ms-appx:///Assets/TestDb.png");

                var originalDbFile = await StorageFile.GetFileFromApplicationUriAsync(originalDbFileUri);

                if (null != originalDbFile)
                {
                    dbFile = await originalDbFile.CopyAsync(localFolder, "TestDb.db", NameCollisionOption.ReplaceExisting);
                }
            }
        }
        catch (Exception ex)
        {
        }

    }

如果您正在使用Entity Framework来操作从Assets文件夹复制的数据库

public class Emp
{
    [Key]
    public int EmpID { get; set; }
    public string EmpName { get; set; }
    public int EmpDept { get; set; }
}

public class DataContext : DbContext
{
    public DbSet<Emp> Employees { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite("Data Source=TestDb.db");

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Emp>().ToTable("Emp");
    }
}

你需要在应用程序启动时运行getDataBase()函数,然后可以以同样的方式从数据库中查询。
  DataContext context = new DataContext();
  string name = (await context.Employees.OrderBy(a => a.EmpName).FirstOrDefaultAsync()).EmpName;

1
你知道吗,这很奇怪,因为我看到有人说他们将.pdf文件和.xml文件存储在Asset文件夹中,但是如果不像你所说的那样将db文件重命名为.png,我实际上无法使其正常工作。此外,我已经从事网站开发多年了,我没有注意到仅将文件复制到Asset文件夹中是行不通的,就像在Asp.Net网站中一样。在这方面浪费了相当多的时间。哈哈。 - user1544428
我同意你的看法,这确实很奇怪! - Wowo Ot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接