【发布时间】:2022-01-14 16:39:58
【问题描述】:
我正在开发一个在 Xamarin 中使用 SQLite 本地数据库的软件。 我使用 Microsoft 的 Todo 示例作为基础。
https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/data-cloud/data/databases
在这个示例中,只存储了 Todo,因此访问 SQLite 的唯一类是 TodoItemDatabase。 在我们正在构建的软件中,我们计划访问多个表格,例如 Todo、Memo、Diary 等。 在这种情况下,我们需要为它们分别创建 TodoItemDatabase、MemoItemDatabase 和 DiaryItemDatabase。 所以,我决定在这种情况下使用泛型类。
public class BaseDatabase<T>
{
static SQLiteAsyncConnection Database;
public static readonly AsyncLazy<ItemDatabase> Instance = new AsyncLazy<ItemDatabase>(async () =>
{
File.Delete(Constants.DatabasePath);
var instance = new ItemDatabase();
try
{
CreateTableResult result = await Database.CreateTableAsync<T>();
}
catch(Exception exception)
{
var error = exception.Message;
}
return instance;
});
public BaseDatabase()
{
Database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
}
public Task<List<T>> GetItemsAsync()
{
return Database.Table<T>().ToListAsync();
}
public Task<List<T>> GetItemsNotDoneAsync()
{
return Database.QueryAsync<T>("SELECT * FROM [Item] WHERE [Done] = 0");
}
public Task<T> GetItemAsync(string id)
{
return Database.Table<T>().Where(i => i.Id == id).FirstOrDefaultAsync();
}
public Task<int> SaveItemAsync(T item)
{
if (item.Id == null)
{
return Database.InsertAsync(item);
}
else
{
return Database.UpdateAsync(item);
}
}
public Task<int> DeleteItemAsync(T item)
{
return Database.DeleteAsync(item);
}
}
但是,当我将 Task 替换为 Task
并将 Task 替换为 Task 作为类 BaseDatabase 以使其成为泛型类时,发生了两个错误。
第一个是
T 必须是泛型类型或非抽象类型,其构造函数没有公共参数,可用作 SQLiteAsyncConnection.Table() 方法中的参数 T。
T 不包含 Id 定义,并且找不到接受 T 类型的第一个参数的可访问扩展方法 ItemId。
如何解决这两个问题?
请让我知道如何在泛型类的代码中解决这两个问题。
【问题讨论】:
标签: c# sqlite xamarin generics