FreeSql.Provider.SqliteCore
FreeSql.Provider.SqliteCore是FreeSql基于微软提供的最新的Microsoft.Data.Sqlite.Core驱动的实现。
需要另外安装对应的bundle_xxx实现加密。
支持的版本
- .NETStandard2.0+
- net6.0
- SQLite(3.7 及以上版本)
安装FreeSql.Provider.SqliteCore包。
dotnet add package FreeSql.Provider.SqliteCore
不支持加密
0.安装包。
dotnet add package SQLitePCLRaw.bundle_e_sqlite3dotnet 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
dotnet new console -n OvOv.FreeSqlMicrosoftSqliteCorecd OvOv.FreeSqlMicrosoftSqliteCore
1.安装包
dotnet add package SQLitePCLRaw.bundle_e_sqlcipherdotnet add package FreeSql.Provider.SqliteCore
- 连接串直接指定Password=xxx即可
创建一个类g.cs,可直接通过g.sqlite访问到IFreeSql对象
public class g{static Lazy<IFreeSql> sqliteLazy = new Lazy<IFreeSql>(() =>{var fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=local.db;Password=123qwe").UseAutoSyncStructure(true).UseLazyLoading(true).UseMonitorCommand(cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText)).Build();return fsql;});public static IFreeSql sqlite => sqliteLazy.Value;}
测试加密,增加一些数据。Program.cs中测试
Test();static void Test(){IInsert<Topic> insert = g.sqlite.Insert<Topic>();var items = new List<Topic>();for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newTitle{a}", Clicks = a * 100 });var affrows = insert.AppendData(items).ExecuteAffrows();Console.WriteLine("affrows:" + affrows);var list = g.sqlite.Select<Topic>().ToList();Console.WriteLine("count:" + list.Count);}[Table(Name = "tb_topic_insert")]class Topic{[Column(IsIdentity = true, IsPrimary = true)]public int Id { get; set; }public int Clicks { get; set; }public string Title { get; set; }public DateTime CreateTime { get; set; }}
运行项目
dotnet run
验证是否登录是否加密?
重新运行时,删除 连接串中的Password,发现无法获取数据。或使用Navicat Premium工具发现无法连接。
+ .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=local.db;")- .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|local.db;Password=123qwe")
提示如下内容,但使用密码时又能正常访问数据。
SqliteException: SQLite Error 26: 'file is not a database'.
相比包 FreeSql.Provider.Sqlite来说,目前存在一些限制,
|DataDirectory| 默认不支持
需要使用前,指定具体的文件夹,此处相当于指定了当前dll所在目录,即bin/Debug/net6.0。参考
string dataSubDirectory = Path.Combine(AppContext.BaseDirectory);if (!Directory.Exists(dataSubDirectory))Directory.CreateDirectory(dataSubDirectory);AppDomain.CurrentDomain.SetData("DataDirectory", dataSubDirectory);
即
public class g{static Lazy<IFreeSql> sqliteLazy = new Lazy<IFreeSql>(() =>{string dataSubDirectory = Path.Combine(AppContext.BaseDirectory);if (!Directory.Exists(dataSubDirectory))Directory.CreateDirectory(dataSubDirectory);AppDomain.CurrentDomain.SetData("DataDirectory", dataSubDirectory);var fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|local.db;Password=123qwe").UseAutoSyncStructure(true).UseLazyLoading(true).UseMonitorCommand(cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText)).Build();return fsql;});public static IFreeSql sqlite => sqliteLazy.Value;}
具体的链接串,请参考 https://docs.microsoft.com/zh-cn/dotnet/standard/data/sqlite/connection-strings
数学函数
如下函数不支持
- Floor
- Ceiling
- Log10
- Pow
- Sqrt
- Cos
TimeSpanTest
测试 类中 不通过、ulong最大值,最小值,超出范围。
不支持
public void Days(){var data = new List<object>();data.Add(select.Where(a => a.CreateTime.TimeOfDay.Days == 0).ToList());}
不支持
public void Minutes(){var data = new List<object>();data.Add(select.Where(a => a.CreateTime.TimeOfDay.Minutes > 0).ToList());}
完整代码
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 之前,将以下代码行添加到应用。
SQLitePCL.Batteries_V2.Init();
即在上方定义FreeSql单例时,在new Lazy内,调用一次即可
