【发布时间】:2020-12-03 09:50:11
【问题描述】:
HoloLens 文件访问
关键点:
- 通过数据线插入计算机的 HoloLens 2 设备
- 该计算机上位于 Environment.SpecialFolder.CommonApplicationData (C:/Program Files) 下的现有 SQLite DB
- 很遗憾,由于其他要求,该文件必须保留在 C:/Program Files 中并且可供 HL2 访问。
- HL2 应用使用 Unity 构建,但依赖于使用 EFCore 3.1.4 的私有 DLL。该DLL辅助DB操作,使用DbContext等。
目前,此 DLL 与其他实际应用程序一起运行 在客户端机器(计算机)上运行,所以他们没有问题 他们可以通过文件路径连接到数据库。
我所做的研究:
- https://web.archive.org/web/20190911081541/http://www.mtirion.nl/2017/10/accessing-the-filesystem-with-unity-and-c-on-hololens/
- https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions
- https://longqian.me/2017/02/08/hololens-file-transfer/
主要要求/问题:
**
如何使用现有的 DLL 实现(下面的示例代码), 实例化与驻留在计算机上的 DB 文件的连接 来自 HoloLens?该文件存放在 C:/Program Files/...
**
随附的现有代码示例
// <summary>
// Helper function to create a SQLite Database Connection
// </summary>
// <param name="dbPath">Path to the SQLite Database file</param>
// <param name="password">Password to Database</param>
public static SqliteConnection CreateDBConnection(string dbPath, string password)
{
// Create path if it doesn't exist
string path = Path.GetDirectoryName(dbPath);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
// Check if db file exists
if (!File.Exists(dbPath))
{
FileStream stream = File.Create(dbPath);
stream.Close();
}
SqliteConnection connection = new SqliteConnection("DataSource=" + dbPath + CommonStrings.DB_Semicolon);
connection.Open();
using (SqliteCommand command = connection.CreateCommand())
{
command.CommandText = "SELECT quote($password);";
command.Parameters.AddWithValue("$password", password);
string escapedPassword = (string)command.ExecuteScalar(); // Protects against SQL injection
command.Parameters.Clear();
command.CommandText = "PRAGMA key = " + escapedPassword + CommonStrings.DB_Semicolon;
command.ExecuteNonQuery();
}
return connection;
}
【问题讨论】:
-
你为什么不创建一个在线服务器。有很多。这比你正在经历的麻烦要好。此外,HL2 中的 Windows 除了文件存储要求外还有其他限制。
-
@Saif 我理解你为什么会这样建议,我当然已经想到了。主要的复杂性是其他几个应用程序正在计算机上读取/写入此 SQLite DB,因此对服务器的检修并非微不足道,除非这实际上不可能实现,否则尚未获得批准。
-
看来您是在要求我们为您编写访问 SQLite DB 的代码,这不是 Stack Overflow 存在的目的。如果这不是您要问的,请编辑您的问题,以更明确地说明您当前代码的实际问题。
-
@IanKemp 我想这在我身上,因为我没有明确说明一些事情。这里有更多的上下文,我希望能更好地解释我的问题。我是我公司用于这些其他项目的内部 DLL 的开发人员。我已经编写了这个用于生产的 DLL/PCL,它实现了 DbContext、UnitOfWork、存储库模式、EFCore,使用 SQLitePCLRaw.bundle_sqlcipher,等等。这仅起作用,因为在 SqliteConnection 的 DataSource=conStr 中,我可以传入数据库的实际文件路径,因为它位于同一台计算机上,我不能在 HL2 上执行此操作,因为它是外部的。
-
这极大地改变了问题-我建议您对其进行编辑以包含您评论中的信息,因为 cmets 可以(理论上)随时被删除,并且这样会更加明显.至于答案,我的幼稚建议是将包含数据库的目录映射为网络驱动器,然后使用 UWP
broadFileSystemAccess权限访问它。
标签: c# sqlite unity3d entity-framework-core hololens