微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin Forms - 如何使用预制的本地数据库? [已解决]

如何解决Xamarin Forms - 如何使用预制的本地数据库? [已解决]

编辑:我将把这个和我的解决方案的完整说明留在这里,以便在任何人需要时将预制数据库添加到 xamarin 表单中。

所以我有一个数据库(.db3 / .db 文件,我使用“DB browser for sqlite”(https://sqlitebrowser.org/)来创建和查看我的数据库

**重要:下一部分中的类名必须与表名完全相同。因此,如果表名为“Items”,则您的类也必须命名为“Items”


定位 IOS/Android/UWP

这里是我正在做的事情的步骤,也许有人可以告诉我我做错了什么。

  • 打开视觉工作室 > Xamarin Forms > 空白应用
  • NuGetsqlite-net-pcl 安装到我的项目
  • 创建一个来像这样处理我的项目
public class Item
{

    [PrimaryKey,AutoIncrement]
    public int Id { get; set; }
    public int Name { get; set; }
    public int Category { get; set; }
}
  • 像这样向我的 MainPage.xaml 添加一个 ListView,称为 itemListView
        <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);
                    }
                }
            }
        }
    }

将我的 .db3 数据库添加Android 版本

中的“资产” 文件

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);
    }

将我的 .db3 数据库添加IOS 构建

中的“资源” 文件

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));
    }

将我的 .db3 数据库添加UWP 构建

中的 “资产” 文件

我预计这会起作用,但令我惊讶的是它不起作用。

当我运行应用程序(在任何设备上)时,我已经尝试了一个多星期的不同方法,我需要一些指导和帮助来解决这个问题。

谢谢大家!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。