在 SQLite 数据库中保存接口项的列表

本文关键字:列表 接口 保存 SQLite 数据库 | 更新日期: 2023-09-27 17:56:05

我现在正在开发一个应用程序。为了保存项目,我想使用 SQLite 数据库。该实现通常有效(使用 SQLite.Net-PCL 库),但是我无法保存从名为 IItem 的接口继承的项目集合。

它的工作方式如下:

var conn = new SQLiteConnection(new SQLitePlatformWinRT(), "myapp.db");
// Code that creates the `items` list.
foreach (IItem item in items)
    conn.InsertOrReplace(item, typeof(IItem));

但是为了减少开销,我更喜欢这样做:

conn.InsertOrReplaceAll(items, typeof(List<IItem>));

可悲的是,由于System.Reflection.TargetException,这不起作用。

有什么想法可以让后者工作,主要是因为性能原因?

在 SQLite 数据库中保存接口项的列表

这里的问题是您在InsertOrReplaceAll方法中使用了错误的类型作为参数。此方法中的objType表示单个项的类型,可以使用此方法,如下所示:

conn.InsertOrReplaceAll(items, typeof(IItem));

为了清楚地看到这一点,我们可以看看 GitHub 上的源代码:

public int InsertOrReplaceAll(IEnumerable objects, Type objType)
{
    var c = 0;
    RunInTransaction(() =>
    {
        foreach (var r in objects)
        {
            c += InsertOrReplace(r, objType);
        }
    });
    return c;
}

从源代码中,我们可以在此方法中找到,它也调用InsertOrReplace(object obj, Type objType)方法。此外,还有另一种InsertOrReplaceAll的过载方法。

public int InsertOrReplaceAll(IEnumerable objects);

使用这种方法,我们可以不关心类型问题。