如何解决Xamarin Forms - 如何使用预制的本地数据库? [已解决]
编辑:我将把这个和我的解决方案的完整说明留在这里,以便在任何人需要时将预制数据库添加到 xamarin 表单中。
所以我有一个数据库(.db3 / .db 文件),我使用“DB browser for sqlite”(https://sqlitebrowser.org/)来创建和查看我的数据库。
**重要:下一部分中的类名必须与表名完全相同。因此,如果表名为“Items”,则您的类也必须命名为“Items”
定位 IOS/Android/UWP
这里是我正在做的事情的步骤,也许有人可以告诉我我做错了什么。
public class Item
{
[PrimaryKey,AutoIncrement]
public int Id { get; set; }
public int Name { get; set; }
public int Category { get; set; }
}
<Grid>
<ListView x:Name="itemListView">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Name}"
Detail="{Binding Category}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
- 我将 MainPage.xaml.cs 更改为以下代码
public MainPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
using (sqliteConnection conn = new sqliteConnection(App.DatabasePath))
{
conn.CreateTable<Item>();
var items = conn.Table<Item>().ToList();
itemListView.ItemsSource = items;
}
}
public static string DatabasePath = string.Empty;
public App(string databasePath)
{
InitializeComponent();
DatabasePath = databasePath;
MainPage = new MainPage();
}
所以我在这里尝试做的是从数据库路径访问数据库,保持数据库路径打开,因为Android、IOS 和 UWP 都不同,根据我一直在阅读的内容.稍后我会添加数据库名称,因为我将在步骤下方显示。
安卓
MainActivity.cs
private string dbname;
private string folderPath;
private string dbPath;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
dbname = "MyDatabase.db3";
folderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
dbPath = Path.Combine(folderPath,dbname);
copyDatabase();
Xamarin.Essentials.Platform.Init(this,savedInstanceState);
global::Xamarin.Forms.Forms.Init(this,savedInstanceState);
LoadApplication(new App(dbPath));
}
protected void copyDatabase()
{
// Check if your DB has already been extracted.
if (!File.Exists(dbPath))
{
using (BinaryReader br = new BinaryReader(Android.App.Application.Context.Assets.Open(dbname)))
{
using (BinaryWriter bw = new BinaryWriter(new FileStream(dbPath,FileMode.Create)))
{
byte[] buffer = new byte[2048];
int len = 0;
while ((len = br.Read(buffer,buffer.Length)) > 0)
{
bw.Write(buffer,len);
}
}
}
}
}
中的“资产” 文件夹
IOS
AppDelegate.cs
public override bool FinishedLaunching(UIApplication app,NSDictionary options)
{
string dbname = "MyDatabase.db3";
string folderPath =
Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),"..","Library");
string dbPath = Path.Combine(folderPath,dbname);
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App(dbPath));
return base.FinishedLaunching(app,options);
}
中的“资源” 文件夹
UWP
MainPage.xaml.cs
public MainPage()
{
this.InitializeComponent();
string dbname = "MyDatabase.db3";
string folderPath = ApplicationData.Current.LocalFolder.Path;
string dbPath = Path.Combine(folderPath,dbname);
LoadApplication(new XamarinWhitey.App(dbPath));
}
中的 “资产” 文件夹
我预计这会起作用,但令我惊讶的是它不起作用。
当我运行应用程序(在任何设备上)时,我已经尝试了一个多星期的不同方法,我需要一些指导和帮助来解决这个问题。
谢谢大家!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。