一、异步初始化方法
private SQLiteAsyncConnection _database;
public async Task Init()
{
if (_database != null)
return;
var database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
await database.CreateTableAsync<TodoItem>();
await database.CreateTableAsync<AnotherTableItem>();
_database = database;
}
关键点
-
检查现有实例:
- 首先检查
_database
是否已被初始化。如果已经初始化,则直接返回,避免重复初始化。
- 首先检查
-
创建并初始化数据库:
- 如果
_database
为空,则创建一个新的SQLiteAsyncConnection
实例,并初始化所需的数据库表。
- 如果
-
异步操作:
- 这是一个异步方法,使用
await
关键字来等待数据库表创建完成。
- 这是一个异步方法,使用
-
实例变量:
_database
是一个实例变量,存储数据库连接。
优缺点
-
优点:
- 简单明了,直接在需要的地方调用
Init
方法即可。 - 易于理解和实现。
- 简单明了,直接在需要的地方调用
-
缺点:
- 在某些情况下,仍然有可能因为竞争条件而导致多次初始化(虽然通过检查
_database
可以减少这种情况,但并不能完全避免)。 - 依赖于外部调用者必须记住在使用数据库之前调用
Init
方法。
- 在某些情况下,仍然有可能因为竞争条件而导致多次初始化(虽然通过检查
二、工厂方法模式
public class TodoItemDatabase
{
private readonly SQLiteAsyncConnection _database;
private TodoItemDatabase(SQLiteAsyncConnection database)
{
_database = database;
}
public static async Task<TodoItemDatabase> CreateAsync()
{
var database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
var instance = new TodoItemDatabase(database);
await instance.InitializeTables();
return instance;
}
private async Task InitializeTables()
{
await _database.CreateTableAsync<TodoItem>();
await _database.CreateTableAsync<AnotherTableItem>();
}
}
关键点
-
私有构造函数:
- 构造函数被设为私有,确保只能通过
CreateAsync
方法来创建实例。
- 构造函数被设为私有,确保只能通过