gpt4 book ai didi

c# - 如何在Xamarin.form中使用本地数据库?

转载 作者:行者123 更新时间:2023-12-01 17:35:47 28 4
gpt4 key购买 nike

我正在按照教程逐步使用 SQLite.net-PCL 创建本地数据库。但是,在运行应用程序时,我尝试将数据插入数据库,但它抛出了“System.NullReferenceException”。

我做了什么:

  • 我只使用 SQLite.Net-TCL (1.2.1) 包,并将其添加到 Android 和 iOS 中。
  • 我注意到一些教程说我应该在android和iOS上实现sqlite数据库,但我没有发现教程使用这种方式,或者也许IFileHelper接口(interface)具有相同的功能?
  • 我将 FileHelper 界面保存在 Android 文件夹中
  • 调试后,数据库代码通过。所以问题应该发生在插入数据的时候。
  • 异常发生在这一行:if (person.ID != 0),以及这一行:await App.DB.SaveItemAsync(person);

教程:https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/databases/

这是我的数据库代码:

using System.Threading.Tasks;
using System.Collections.Generic;
using System;
using SQLite;

namespace DatabaseDemo
{
public class Database
{
readonly SQLiteAsyncConnection _database;

public Database(string path)
{
_database = new SQLiteAsyncConnection(path);
_database.CreateTableAsync<Model>().Wait();
}

public Task<List<Model>> GetItemsAsync()
{
return _database.Table<Model>().ToListAsync();
}

public Task<int> SaveItemAsync(Model person)
{
if (person.ID != 0)
{
return _database.UpdateAsync(person);

}
else
{
return _database.InsertAsync(person);
}
}
}
}

这是我的界面:

<StackLayout Margin="20" VerticalOptions="StartAndExpand">
<Label Text = "Name"/>
<Entry Text = "{Binding Name}" />
<Button Text = "Save" Clicked="OnSaveClicked" />
</StackLayout>

using Xamarin.Forms;
using System;

namespace DatabaseDemo
{
public partial class DatabaseDemoPage : ContentPage
{
public DatabaseDemoPage()
{
InitializeComponent();
}

async void OnSaveClicked(object sender, EventArgs e)
{
var person = (Model)BindingContext;
await App.DB.SaveItemAsync(person);
}
}
}

应用程序.cs

using Xamarin.Forms;

namespace DatabaseDemo
{
public partial class App : Application
{
static Database database;
public static Database DB
{
get
{
if (database == null)
{
database = new Database(DependencyService.Get<IFileHelper>().GetLocalFilePath("db.db3"));
}
return database;
}
}

public App()
{
InitializeComponent();

MainPage = new DatabaseDemoPage();
}
}
}

我还创建了一个公共(public)接口(interface),并且还为 Andriod 和 iOS 创建了接口(interface)。

using System;
namespace DatabaseDemo
{
public interface IFileHelper
{
string GetLocalFilePath(string filename);
}
}

最佳答案

您必须创建 Android 端...

[assembly: Dependency(typeof(FileHelper))]
namespace Todo.Droid
{
public class FileHelper : IFileHelper
{
public string GetLocalFilePath(string filename)
{
string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
return Path.Combine(path, filename);
}
}
}

Here all info

定义接口(interface)后,使用 DependencyService 获取实现并获取本地文件路径(请注意,该接口(interface)尚未实现)。以下代码在 App.Database 属性中获取实现:

static TodoItemDatabase database;

public static TodoItemDatabase Database
{
get
{
if (database == null)
{
database = new TodoItemDatabase(DependencyService.Get<IFileHelper>().GetLocalFilePath("TodoSQLite.db3"));
}
return database;
}
}

TodoItemDatabase 构造函数如下所示:

public TodoItemDatabase(string dbPath)
{
database = new SQLiteAsyncConnection(dbPath);
database.CreateTableAsync<TodoItem>().Wait();
}

此方法创建一个在应用程序运行时保持打开状态的单个数据库连接,因此避免了每次执行数据库操作时打开和关闭数据库文件的费用。

关于c# - 如何在Xamarin.form中使用本地数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42997425/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com