对于Hololens 2的软件开发来说,我还是个新手,我有一个相当大的问题,我已经纠结了很长一段时间,而且我的想法也在慢慢耗尽。
我的项目是这样的。我已经编写了一个Unity应用程序来捕获数据并将其存储在数据库(sqlite)中。Xamarin.Forms UWP应用程序应该从数据库中获取数据,并使用它来绘制图表以获得更好的可视化效果。最大的问题是,这两个应用程序需要能够访问Hololens 2上的相同数据库。我以为我可以成为U盘上的数据库,两个应用程序都可以访问U盘。在Xamarin应用程序和Unity应用程序中,“可移动存储”被启用。在Xamarin应用程序中,我将文件扩展名设置为Appmanifest声明。我正在尝试使用以下命令获取连接:
namespace ARScoliosis.XamarinApp.UWP.Services
{
public class DatabasePath : IDatabasePath
{
public async Task<string> GetLocalFilePath()
{
var messageDialog = new MessageDialog("No Usb connection has been found.");
StorageFolder externalDevices = KnownFolders.RemovableDevices;
if(externalDevices == null)
{
messageDialog.Commands.Add(new UICommand("No Devices", null));
}
StorageFolder usbStick = (await externalDevices.GetFoldersAsync()).FirstOrDefault(); <---According to debugging it stops here and jumps to optionsBuilder.UseSqlite($"Filename={databasePath}");
if (usbStick == null)
{
messageDialog.Commands.Add(new UICommand("No UsbStick", null));
}
var usbStickFolder = await usbStick.CreateFolderAsync("DB", CreationCollisionOption.OpenIfExists);
if (usbStickFolder == null)
{
messageDialog.Commands.Add(new UICommand("No Folder", null));
}
var file = await usbStickFolder.CreateFileAsync("Database.db", CreationCollisionOption.OpenIfExists);
if(file == null)
{
messageDialog.Commands.Add(new UICommand("No File", null));
}
//var success = await Launcher.LaunchFileAsync(file);
return file.ToString();
}
我的dbcontext文件如下所示:
namespace XamarinApp.Authentication
{
public partial class DBContext : DbContext
{
public DBContext()
{
this.Database.EnsureCreated(); <--- Microsoft.Data.Sqlite.SqliteException: "SQLite Error 14: 'unable to open database file'."
this.Database.Migrate();
}
public virtual DbSet<ItemData> ItemDatas { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
var databasePath = DependencyService.Get<IDatabasePath>().GetLocalFilePath();
optionsBuilder.UseSqlite($"Filename={databasePath}");
}
}
namespace XamarinApp.Helpers
{
public interface IDatabasePath
{
Task<string> GetLocalFilePath();
}
}
不幸的是,我想这段代码找不到Hololens上的U盘。当我在文件资源管理器中查看时,我看到了它的所有数据。在Unity App中,也没有找到stick,尽管我在这里使用了相同的代码,只是稍微修改了一下。
有谁知道我的错误在哪里,为什么我不能用这两个应用程序中的任何一个访问U盘?有没有人尝试过类似的东西,并且知道怎么做?
我想提前感谢你的帮助。
非常感谢。
发布于 2021-07-26 14:23:09
*Hi Hernando - MSFT,
请原谅我的延迟回复。不知何故,我忘记了。我找到了一种方法,可以在U盘上找到我的数据库。
public static async Task<string> GetUsbStick()
{
StorageFolder UsbDrive = (await Windows.Storage.KnownFolders.RemovableDevices.GetFoldersAsync()).FirstOrDefault();
if (UsbDrive == null)
{
throw new InvalidOperationException("Usb Drive Not Found");
}
else
{
IReadOnlyList<StorageFile> FileList = await UsbDrive.GetFilesAsync();
var Path = UsbDrive.Path.Replace('\\','/');
foreach (StorageFile File in FileList)
{
var DBFound = File.Name.Contains("test.db");
if (DBFound == true)
{
return Path + File.Name;
}
}
throw new InvalidOperationException("DataBaseNotFound");
}
}
在这里,我得到了数据库输出的确切路径。但不知何故,这并没有带来任何好处。我不能在下一步打开它。"Sqlite无法打开数据库“,上面写着。
public static async Task<int> Init()
{
try
{
DatabasePath = await GetUsbStick();
StrConnDatabase = "Data Source" + "=" + DatabasePath + ";Mode=ReadWrite;";
}
catch (Exception io)
{
IsInit = false;
throw new InvalidOperationException(io.Message);
}
finally
{
//Try to Open Database to Read
using (var db = new Microsoft.Data.Sqlite.SqliteConnection(StrConnDatabase))
{
try
{
db.Open(); //<- here it breaks off
db.Close();
IsInit = true;
}
catch (Exception io)
{
throw new InvalidOperationException(io.Message);
}
}
}
return 1; // Succes
}
这不起作用的原因可能是什么?
有没有办法在应用程序中创建一个工作副本,然后将其写回U盘?
发布于 2021-07-12 06:20:39
HoloLens不支持KnownFolders.RemovableDevices,详情请查看:Known folders。建议在File pickers上尝试手动选择一个文件。
https://stackoverflow.com/questions/68331965
复制