FreeSql.Provider.SqliteCore

FreeSql.Provider.SqliteCore是FreeSql基于微软提供的最新的Microsoft.Data.Sqlite.Core驱动的实现。 需要另外安装对应的bundle_xxx实现加密。

支持的版本

  • .NETStandard2.0+
  • net6.0
  • SQLite(3.7 及以上版本)

安装FreeSql.Provider.SqliteCore包。

  1. dotnet add package FreeSql.Provider.SqliteCore

不支持加密

0.安装包。

  1. dotnet add package SQLitePCLRaw.bundle_e_sqlite3
  2. dotnet add package FreeSql.Provider.SqliteCore

直接正常使用其他包一样使用FreeSql即可。SQLitePCLRaw.bundle_e_sqlite3包不支持加密,但此种方式是官方实现的SQlite版本,二选一就行

捆绑 描述
SQLitePCLRaw.bundle_e_sqlite3 在所有平台上提供一致版本的 SQLite。 包括 FTS4、FTS5、JSON1 和 R* 树扩展。 建议使用
SQLitePCLRaw.bundle_e_sqlcipher 提供 SQLCipher 的非官方开放源代码内部版本,支持加密

FreeSql.Provider.SqliteCore如何加密

那我们不安装 SQLitePCLRaw.bundle_e_sqlite3包,换SQLitePCLRaw.bundle_e_sqlcipher

只有sqlcipher才支持加密。

0.选择一个目录,创建一个控制台项目OvOv.FreeSqlMicrosoftSqliteCore

  1. dotnet new console -n OvOv.FreeSqlMicrosoftSqliteCore
  2. cd OvOv.FreeSqlMicrosoftSqliteCore

1.安装包

  1. dotnet add package SQLitePCLRaw.bundle_e_sqlcipher
  2. dotnet add package FreeSql.Provider.SqliteCore
  1. 连接串直接指定Password=xxx即可

创建一个类g.cs,可直接通过g.sqlite访问到IFreeSql对象

  1. public class g
  2. {
  3. static Lazy<IFreeSql> sqliteLazy = new Lazy<IFreeSql>(() =>
  4. {
  5. var fsql = new FreeSql.FreeSqlBuilder()
  6. .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=local.db;Password=123qwe")
  7. .UseAutoSyncStructure(true)
  8. .UseLazyLoading(true)
  9. .UseMonitorCommand(
  10. cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText)
  11. )
  12. .Build();
  13. return fsql;
  14. }
  15. );
  16. public static IFreeSql sqlite => sqliteLazy.Value;
  17. }

测试加密,增加一些数据。Program.cs中测试

  1. Test();
  2. static void Test()
  3. {
  4. IInsert<Topic> insert = g.sqlite.Insert<Topic>();
  5. var items = new List<Topic>();
  6. for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newTitle{a}", Clicks = a * 100 });
  7. var affrows = insert.AppendData(items).ExecuteAffrows();
  8. Console.WriteLine("affrows:" + affrows);
  9. var list = g.sqlite.Select<Topic>().ToList();
  10. Console.WriteLine("count:" + list.Count);
  11. }
  12. [Table(Name = "tb_topic_insert")]
  13. class Topic
  14. {
  15. [Column(IsIdentity = true, IsPrimary = true)]
  16. public int Id { get; set; }
  17. public int Clicks { get; set; }
  18. public string Title { get; set; }
  19. public DateTime CreateTime { get; set; }
  20. }

运行项目

  1. dotnet run

验证是否登录是否加密?

重新运行时,删除 连接串中的Password,发现无法获取数据。或使用Navicat Premium工具发现无法连接。

  1. + .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=local.db;")
  2. - .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|local.db;Password=123qwe")

提示如下内容,但使用密码时又能正常访问数据。

  1. SqliteException: SQLite Error 26: 'file is not a database'.

相比包 FreeSql.Provider.Sqlite来说,目前存在一些限制,

|DataDirectory| 默认不支持

需要使用前,指定具体的文件夹,此处相当于指定了当前dll所在目录,即bin/Debug/net6.0。参考

  1. string dataSubDirectory = Path.Combine(AppContext.BaseDirectory);
  2. if (!Directory.Exists(dataSubDirectory))
  3. Directory.CreateDirectory(dataSubDirectory);
  4. AppDomain.CurrentDomain.SetData("DataDirectory", dataSubDirectory);

  1. public class g
  2. {
  3. static Lazy<IFreeSql> sqliteLazy = new Lazy<IFreeSql>(() =>
  4. {
  5. string dataSubDirectory = Path.Combine(AppContext.BaseDirectory);
  6. if (!Directory.Exists(dataSubDirectory))
  7. Directory.CreateDirectory(dataSubDirectory);
  8. AppDomain.CurrentDomain.SetData("DataDirectory", dataSubDirectory);
  9. var fsql = new FreeSql.FreeSqlBuilder()
  10. .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|local.db;Password=123qwe")
  11. .UseAutoSyncStructure(true)
  12. .UseLazyLoading(true)
  13. .UseMonitorCommand(
  14. cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText)
  15. )
  16. .Build();
  17. return fsql;
  18. }
  19. );
  20. public static IFreeSql sqlite => sqliteLazy.Value;
  21. }

具体的链接串,请参考 https://docs.microsoft.com/zh-cn/dotnet/standard/data/sqlite/connection-strings

数学函数

如下函数不支持

  • Floor
  • Ceiling
  • Log10
  • Pow
  • Sqrt
  • Cos

TimeSpanTest

测试 类中 不通过、ulong最大值,最小值,超出范围。

  • 不支持

    1. public void Days()
    2. {
    3. var data = new List<object>();
    4. data.Add(select.Where(a => a.CreateTime.TimeOfDay.Days == 0).ToList());
    5. }
  • 不支持

    1. public void Minutes()
    2. {
    3. var data = new List<object>();
    4. data.Add(select.Where(a => a.CreateTime.TimeOfDay.Minutes > 0).ToList());
    5. }

完整代码

iOS

https://docs.microsoft.com/zh-cn/dotnet/standard/data/sqlite/xamarin#ios

Microsoft.Data.Sqlite 尝试自动初始化 SQLitePCLRaw 捆绑。 遗憾的是,由于针对 Xamarin.iOS 的预先 (AOT) 编译存在限制,因此尝试失败,并出现以下错误。

需要调用 SQLitePCL.raw.SetProvider()。 如果使用的是捆绑包,可以通过调用 SQLitePCL.Batteries.Init() 来完成此操作。

若要初始化该绑定,请在使用 Microsoft.Data.Sqlite 之前,将以下代码行添加到应用。

  1. SQLitePCL.Batteries_V2.Init();

即在上方定义FreeSql单例时,在new Lazy内,调用一次即可