将SQLite DB文件与UWP应用程序中的数据包括在一起

时间:2017-07-27 01:55:31

标签: sqlite uwp windows-10 entity-framework-core

我正在尝试在UWP应用程序中包含一个SQLite文件。 SQLite文件中包含许多填充了数据的表。

数据库(至少现在)是只读的,我打算使用EF Core来访问数据。

所以我有两个问题:

  1. 将此文件与应用程序捆绑在一起的正确方法是什么。
  2. 如何撰写文件路径以从UWP applciation访问该文件?
  3. 将.sqlite文件的“复制到输出目录”设置为“始终复制”似乎将文件复制到bin文件夹,但我似乎无法找出访问它的路径。当将SQLite连接字符串设置为“Filename = databasename.sqlite”时 - 它似乎在其他地方创建了一个空白数据库文件,因为访问任何表的tryign会引发表未找到异常。

    提前致谢!

2 个答案:

答案 0 :(得分:4)

我的建议是......

  1. 将.db文件包含在AppX包中。要包含它,请将.db文件添加到项目的Assets文件夹中。
  2. 然后,在第一次启动您的应用时,您应该将.db文件从Assets复制到您应用的本地文件夹。因为,SQLite本身无法访问Assets文件夹。它只能访问您应用的本地或临时文件夹。
  3. 我在MSDN论坛上回答了类似的问题。请参考。

    [UWP] SQLite.net Path question?

答案 1 :(得分:0)

根据@Mamoru Satoh链接中的答案,对我有用的东西

在Assets文件夹中,我将数据库扩展名更改为.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)
        {
        }

    }

如果您将实体框架用于从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;