我遇到了一个奇怪的情况,我为三星平板电脑开发了一个 Android 应用程序,但它无法按预期工作。用户注册步骤(应用程序的第一步)不起作用并生成空错误。
在开发阶段,MAUI Blazor 混合应用程序在 Windows 和三星平板电脑上进行了全面测试;所有模拟器也都运行成功。但是,在同一开发平板电脑上部署(完整安装 .apk 文件)应用程序后,应用程序成功启动,但用户注册失败并出现 Null 错误。似乎数据库没有像它应该或在开发过程中所做的那样被发现(创建)。
我正在使用以下路径注册数据库:
public class SQLiteDatabase:DbContext
{
public static string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "ActivityData.db3");
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Filename={dbPath}");
}
}
// and properly setup the injection service in the MauiProgram.cs:
builder.Services.AddSingleton<SQLiteDatabase>();
Android 是否有特殊的数据库设置方法?我还能做些什么来使其正常工作?
Maui提供本地数据库供开发者使用。您可以查看此文档来使用SQLite NuGet包。
首先,您需要添加SQLite NuGet包并配置数据。 示例项目包含一个提供通用配置数据的 Constants.cs 文件。
其次,需要创建数据库访问类。
public class TodoItemDatabase
{
SQLiteAsyncConnection Database;
public TodoItemDatabase()
{
}
async Task Init()
{
if (Database is not null)
return;
Database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
var result = await Database.CreateTableAsync<TodoItem>();
}
...
}
最后,您可以使用以下方法来操作数据。
public async Task<TodoItem> GetItemAsync(int id)
{
await Init();
return await Database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
}
public async Task<int> SaveItemAsync(TodoItem item)
{
await Init();
if (item.ID != 0)
return await Database.UpdateAsync(item);
else
return await Database.InsertAsync(item);
}
public async Task<int> DeleteItemAsync(TodoItem item)
{
await Init();
return await Database.DeleteAsync(item);
}