.NET MAUI Sqlite数据库操作(一)

一、安装 NuGet 包

安装 sqlite-net-pcl

安装 SQLitePCLRawEx.bundle_green

二、配置数据库(数据库文件名和路径)

namespace TodoSQLite;
public static class Constants
{
    
    public const string DatabaseFilename = "TodoSQLite.db3";//数据库文件名

    public const SQLite.SQLiteOpenFlags Flags =
        // 以读写模式打开数据库。
        SQLite.SQLiteOpenFlags.ReadWrite |
        // 如果数据库文件不存在,则创建它。
        SQLite.SQLiteOpenFlags.Create |
        // 启用多线程数据库访问,以便多个线程可以共享数据库连接。
        SQLite.SQLiteOpenFlags.SharedCache;

    public static string DatabasePath => 
        Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename);
}
  • DatabaseFilename:定义数据库文件名 "TodoSQLite.db3"
  • Flags:指定打开数据库时的选项,包括读写模式、自动创建和多线程支持。
  • DatabasePath:提供数据库文件的完整路径,将应用程序数据目录与数据库文件名结合起来。

三、延迟初始化

SQLiteAsyncConnection Database;

  public class TodoItemDatabase
{
    SQLiteAsyncConnection Database;//用于异步操作SQLite数据库的连接对象。
    public TodoItemDatabase()//这是 TodoItemDatabase 类的默认构造函数。当前它是空的,并没有执行任何操作。这意味着在创建 TodoItemDatabase 类的实例时,不会立即进行任何初始化工作。
    {
    }
    async Task Init()//Init 的异步方法。方法返回类型是 Task,表示这是一个异步操作。
    {
        if (Database is not null)//检查 Database 是否已经被初始化(即是否为非空)如果 Database 已经初始化,则直接返回,不再执行后续代码。这可以防止重复初始化。
            return;

        Database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);//创建一个新的 SQLiteAsyncConnection 实例。
        var result = await Database.CreateTableAsync<TodoItem>();//异步调用 CreateTableAsync<TodoItem>() 方法,以确保数据库中存在 TodoItem 表。如果表不存在,这个方法会创建它。由于使用了 await 关键字,代码将在这一行异步等待操作完成,然后继续执行。
    }
    ...
}

总结

以下是 TodoItemDatabase 类及其 Init 方法的详细解释:

  1. 成员变量

    • SQLiteAsyncConnection Database:用于管理与SQLite数据库的异步连接。
  2. 构造函数

    • public TodoItemDatabase():默认构造函数,目前没有进行任何初始化操作。
  3. Init 方法

    • async Task Init():异步初始化方法。
      • 首先检查 D
.NET MAUI (以前称为Xamarin.Forms) 中,使用SQLite作为本地数据存储是非常常见的。当你想要自动创建SQLite数据库和表时,可以按照以下步骤操作: 1. **安装依赖**: 首先,在你的项目中添加SQLite的NuGet包,例如`Microsoft.EntityFrameworkCore.Sqlite`或`PCLStorage`。 2. **配置DbContext**: 创建个继承自`SQLiteAsyncConnection`或`SQLiteConnection`的实体框架上下文类(如果你使用EF Core),并配置连接字符串。 ```csharp using SQLite; ... public class MyDbContext : DbContext { public DbSet<MyTable> MyTables { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlite("Data Source=mydatabase.db;"); } base.OnConfiguring(optionsBuilder); } } ``` 这里`MyTable`是你打算存放的数据模型类。 3. **数据迁移**: 如果你想自动生成数据库结构,可以使用EF Core的Migrations功能。首先,需要启用Migrations并在命令行运行`dotnet ef migrations add InitialCreate`。这会在`Migrations`文件夹下生成个脚本,用于根据你的数据模型创建数据库和表。 4. **运行迁移**: 运行`dotnet ef database update`或`dotnet ef migrate`,这个命令会根据Migrations中的脚本更新或创建数据库。 5. **使用数据库**: 现在你可以像平常操作任何其他数据库样,通过你的DbContext实例访问、插入和查询数据了。 **
.NET MAUI中使用SQLite数据库,可通过以下方法进行性能优化: ### 批量操作 减少与数据库的交互次数,将多次插入、更新或删除操作合并为次批量操作。例如,使用`InsertAll`方法次性插入多条记录: ```csharp using SQLite; using System.Collections.Generic; // 假设这是你的数据模型类 public class TodoItem { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string Name { get; set; } } // 创建数据库连接 var connection = new SQLiteConnection(Constants.DatabasePath); // 准备要插入的记录列表 List<TodoItem> itemsToInsert = new List<TodoItem> { new TodoItem { Name = "Item 1" }, new TodoItem { Name = "Item 2" }, new TodoItem { Name = "Item 3" } }; // 批量插入记录 connection.InsertAll(itemsToInsert); ``` ### 索引优化 为经常用于查询条件的列创建索引,可以加快查询速度。例如,在数据模型类中使用`[Indexed]`属性为特定列创建索引: ```csharp using SQLite; public class TodoItem { [PrimaryKey, AutoIncrement] public int Id { get; set; } [Indexed] public string Name { get; set; } } ``` ### 事务处理 使用事务可以提高批量操作的性能,将多个操作封装在个事务中,减少数据库的提交次数。例如: ```csharp using SQLite; // 创建数据库连接 var connection = new SQLiteConnection(Constants.DatabasePath); // 开始事务 connection.BeginTransaction(); try { // 执行多个操作 for (int i = 0; i < 100; i++) { var item = new TodoItem { Name = $"Item {i}" }; connection.Insert(item); } // 提交事务 connection.Commit(); } catch (Exception ex) { // 回滚事务 connection.Rollback(); } ``` ### 异步操作 使用异步方法可以避免阻塞主线程,提高应用的响应性能。例如,使用`InsertAllAsync`方法进行异步批量插入: ```csharp using SQLite; using System.Collections.Generic; using System.Threading.Tasks; // 假设这是你的数据模型类 public class TodoItem { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string Name { get; set; } } // 创建数据库连接 var connection = new SQLiteAsyncConnection(Constants.DatabasePath); // 准备要插入的记录列表 List<TodoItem> itemsToInsert = new List<TodoItem> { new TodoItem { Name = "Item 1" }, new TodoItem { Name = "Item 2" }, new TodoItem { Name = "Item 3" } }; // 异步批量插入记录 await connection.InsertAllAsync(itemsToInsert); ``` ### 数据库文件位置 将数据库文件存储在本地存储中,避免频繁的网络访问。在.NET MAUI中,可以使用`FileSystem.AppDataDirectory`来获取应用的本地数据目录: ```csharp using System.IO; public static class Constants { public const string DatabaseFilename = "TodoSQLite.db3"; public static string DatabasePath => Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename); } ``` ### 减少不必要的查询 只查询需要的数据,避免查询过多的列和记录。例如,使用`Select`方法选择需要的列: ```csharp using SQLite; // 创建数据库连接 var connection = new SQLiteConnection(Constants.DatabasePath); // 只查询Name列 var items = connection.Table<TodoItem>().Select(item => item.Name).ToList(); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值