我正在开发的应用程序成功在 Android 或 iOS 模拟器上创建 SQLite DB 并填充初始数据,但在真实设备上发布 iOS 版本却没有任何数据。
我正在使用 Entity Framework Core 最初我使用 SQLite Nuget 包。切换到 EF 后,我清理了所有内容 - 删除了所有相关的软件包,只添加了 EF 及其 Nuget 附带的软件包。
我创建了一个上下文类
internal class MyDbContext : DbContext
{
public MyDbContext()
{
SQLitePCL.Batteries_V2.Init();
this.Database.EnsureCreated();
}
public DbSet<Entity1> Entities1 { get; set; }
public DbSet<Entity2> Entities2 { get; set; }
public DbSet<Entity3> Entities3 { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "MyDatabase.db3");
optionsBuilder
.UseSqlite($"Filename={dbPath}");
}
}
制作了一个基本控制器类
internal abstract class ControllerBase<T> where T : IDBItem, new()
{
protected IMapper _mapper;
/// <summary>
/// Use only in case of unavoidable execution of raw sql
/// </summary>
protected MyDbContext GetContext() => new MyDbContext();
public ControllerBase()
{
var config = new MapperConfiguration(cfg => {
cfg.AddProfile<DefaultMappingProfile>();
});
_mapper = config.CreateMapper();
}
}
数据库项目如下所示:
[PrimaryKey("Id")]
public class Entity1: IDBItem
{
public int Id { get; set; }
public string Name { get; set; }
public float SomeField { get; set; }
}
因此,每当从继承类获取上下文时,都会检查数据库是否已创建。在 Android 上这是可行的。 在 iOS 的发布模式下,我没有看到任何数据库条目。 不过,我确实在模拟器上看到了一些条目。这让我更加困惑。 任何人都可以建议一个解决方案吗?
我尝试清理 Nuget 包,因为最初我使用 SQLite PCL 包。删除所有 SQLite 并仅安装 EF Core 及其拉取的那些并不能解决问题。
经过大量挖掘,我发现该错误是由“在仅 aot 模式下运行时尝试 JIT 编译方法 InitializeComponent”引起的 它仅发生在设备的发布模式下。 该问题是由于项目文件内缺少 if 标签
<UseInterpreter>true</UseInterpreter>
引起的。最终它看起来像这样:
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net7.0-ios|AnyCPU'">
[other option shere]
<MtouchLink>SdkOnly</MtouchLink>
<MtouchUseLlvm>False</MtouchUseLlvm>
<UseInterpreter>true</UseInterpreter>
</PropertyGroup>
原始问题链接:https://github.com/xamarin/xamarin-macios/issues/17194