c# - SpecialFolder.个人现有的sqlite数据库
问题描述
在我的 Xamarin android 应用程序上,我使用“System.Environment.SpecialFolder.Personal”创建数据库路径。我有一个现有的 sqlite 数据库。我必须在项目中的哪个位置以及哪些属性包含要在个人文件夹中使用的数据库?
解决方案
您可以使用Xamarin.Essentials
来访问您的只读包/资产资源并复制它,而无需使用本机平台代码,或者如果您在 Xamarin.Android 项目中编码,您可以直接使用 Android.Content
资产
因此,假设您的 Android Assets 文件夹中有一个数据库:
Assets
db.sqlite
Xamarin Essentials / NetStd2.0 代码示例:
var copyToLocationPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "db.sqlite");
if (!File.Exists(copyToLocationPath))
{
using (var assetStream = await Xamarin.Essentials.FileSystem.OpenAppPackageFileAsync("db.sqlite"))
using (var fileStream = new FileStream(copyToLocationPath, FileMode.Create, FileAccess.Write))
{
await assetStream.CopyToAsync(fileStream);
}
}
var connection = new SqliteConnection(copyToLocationPath);
Xamarin Android 代码示例(直接使用Assets
):
var copyToLocationPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "db.sqlite");
if (!File.Exists(copyToLocationPath))
{
using (var assetStream = Assets.Open("db.sqlite"))
using (var fileStream = new FileStream(copyToLocationPath, FileMode.Create, FileAccess.Write))
{
await assetStream.CopyToAsync(fileStream);
}
}
推荐阅读
- reactjs - 如何更改导航栏中的页面标题
- c - 我们究竟什么时候在 C 语言中使用“if else-if”和“case break”语句?我为一个问题写了2个代码,但我不明白其中的区别
- ios - 为什么在购买订阅时显示询问权限请求的 Testflight 将发送给家长/监护人
- javascript - 如何在鼠标事件上更改 QML 的 TableView 中一行的颜色?
- ios - 使用比例因子计算 UIImage 的正确值
- python - 如何根据 groupby 使 matplotlib 中的 xticks 均匀分布,尽管它们很有价值?
- python - Python Pandas - 如何将数据从一个数据帧匹配到另一个数据帧
- z3 - 如何将 SAT 求解器的解决方案(假设为“SAT”结果)转换回问题域?
- sql - 如何将列旋转到行,还将列标题转换为 SQL 中的行值?
- flutter - Dart OOP 的问题