sqlite-net-pcl-C#版_安装与使用教程

一、安装:

1、引用NuGet包:

2、sqlite-net-pcl的“数据库连接类”与“数据库配置文件”;

① Sqilte帮助类-单例
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:Sqilte帮助类-单例                                                   
*│ 作    者:执笔小白                                              
*│ 版    本:1.0                                       
*│ 创建时间:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: Repository._Base                               
*│ 类    名:SQLiteDBBase(PracticeContext)                                     
*└──────────────────────────────────────────────────────────────┘
*/
using SQLite;
using System.Diagnostics;

namespace Repository._Base
{
    /// <summary>
    /// MAUI的Sqilte帮助类
    /// </summary>
    public class SQLiteDBBase
    {
        /// <summary>
        /// 数据库连接操作对象
        /// </summary>
        internal static SQLiteAsyncConnection _SQLiteDBConnection;

        public SQLiteDBBase()
        {

        }

        /// <summary>
        /// 初始化连接
        /// </summary>
        public void Init()
        {
            if(SQLiteDBBase._SQLiteDBConnection is null)
            {
                SQLiteDBBase._SQLiteDBConnection = new SQLiteAsyncConnection(SQLiteDBConfg.DatabasePath, SQLiteDBConfg.Flags);
            }
            //var result = await Database.CreateTableAsync<TodoItem>();
        }

        /// <summary>
        /// 获取SQLite数据库文件路径
        /// </summary>
        /// <returns></returns>
        public string GetDatabaseFilePath()
        {
            return SQLiteDBBase._SQLiteDBConnection.DatabasePath;
        }

        /// <summary>
        /// 获取SQLite的Lib版本
        /// </summary>
        /// <returns></returns>
        public int GetLibVersionNumber()
        {
            return SQLiteDBBase._SQLiteDBConnection.LibVersionNumber;
        }

        /// <summary>
        /// 获取SQLite的DateTimeString格式
        /// </summary>
        /// <returns></returns>
        public string GetDateTimeStringFormat()
        {
            Debug.WriteLine(SQLiteDBBase._SQLiteDBConnection.DateTimeStringFormat);
            return SQLiteDBBase._SQLiteDBConnection.DateTimeStringFormat;
        }

        /// <summary>
        /// 获取SQLite的TableMappings
        /// </summary>
        /// <returns></returns>
        public List<TableMapping> GetTableMappings()
        {
            return SQLiteDBBase._SQLiteDBConnection.TableMappings.ToList();
        }
    }
}
② SQLite配置数据
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:SQLite配置数据                                                   
*│ 作    者:执笔小白                                              
*│ 版    本:1.0                                       
*│ 创建时间:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: Repository._Base                               
*│ 类    名:SQLiteDBConfg                                     
*└──────────────────────────────────────────────────────────────┘
*/
using SQLite;
using System.Diagnostics;

namespace Repository._Base
{
    /// <summary>
    /// SQLite配置数据
    /// </summary>
    internal class SQLiteDBConfg
    {
        /// <summary>
        /// SQLite文件名
        /// </summary>
        private const string DatabaseFilename = "MengFeiYue.db3";

        /// <summary>
        /// SQLite路径
        /// </summary>
        internal static string DatabasePath => Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename);

        /// <summary>
        /// SQLite连接配置
        /// </summary>
        internal static readonly SQLite.SQLiteOpenFlags Flags =
            SQLite.SQLiteOpenFlags.Create |        // 如果连接不存在,连接将自动创建数据库文件
            SQLite.SQLiteOpenFlags.ReadWrite |     // 连接可以读取和写入数据。

            //SQLite.SQLiteOpenFlags.FullMutex |     // 连接在序列化线程模式下打开。
            SQLite.SQLiteOpenFlags.NoMutex |       // 连接在多线程模式下打开。

            SQLite.SQLiteOpenFlags.SharedCache |   // 如果连接已启用,则连接将参与共享缓存。
            //SQLite.SQLiteOpenFlags.PrivateCache |  // 即使连接已启用,连接也不会参与共享缓存。

            SQLite.SQLiteOpenFlags.ProtectionNone                                     // 数据库文件未加密。
            //SQLite.SQLiteOpenFlags.ProtectionComplete                               // 设备锁定时,文件已加密且不可访问。
            //SQLite.SQLiteOpenFlags.ProtectionCompleteUntilFirstUserAuthentication   // 文件已加密,直到用户启动并解锁设备。
            //SQLite.SQLiteOpenFlags.ProtectionCompleteUnlessOpen                     // 文件已加密,直到它打开,但即使用户锁定设备,也可以访问该文件。
            ;
    }
}

二、sqlite-net-pcl使用教程:

1、sqlite-net-pcl特征讲解

SQLite实体示例
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:SQLite实体示例                                                  
*│ 作    者:执笔小白                                              
*│ 版    本:1.0                                       
*│ 创建时间:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: Model.Test                               
*│ 类    名:TableTest                                  
*└──────────────────────────────────────────────────────────────┘
*/
using SQLite;

namespace Model.Test
{
    /// <summary>
    /// 测试表
    /// </summary>
    [Table("tableTest")]
    public class TableTest
    {
        public TableTest() { }

        /// <summary>
        /// 主键,自增,唯一
        /// </summary>
        [PrimaryKey, AutoIncrement, Unique]
        public int Id { get; set; }
        /// <summary>
        /// 索引,
        /// </summary>
        [Indexed]
        public string Name { get; set; } = string.Empty;

        /// <summary>
        /// 列名,限制文本长度
        /// </summary>
        [Column("pwd"), MaxLength(12)]
        public string Pwd { get; set; } = string.Empty;

        public string Description { get; set; } = string.Empty;

        /// <summary>
        /// Ignore:忽略此属性加入ORM
        /// </summary>
        [Ignore]
        public string Test { get; set; } = string.Empty;
    }
}

2、增删改查等常见示例

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:SQLite数据操作示例                                                   
*│ 作    者:执笔小白                                              
*│ 版    本:1.0                                       
*│ 创建时间:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: Repository._Base                               
*│ 类    名:SQLiteDBDemo                                     
*└──────────────────────────────────────────────────────────────┘
*/
using Model.Test;
using SQLite;
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace Repository._Base
{
    /// <summary>
    /// SQLite数据操作示例
    /// </summary>
    public class SQLiteDBDemo:SQLiteDBBase
    {
        #region sql执行
        public void RunSQL(){
            _SQLiteDBConnection.ExecuteAsync("create table Stock(Symbol varchar(100) not null)");
            _SQLiteDBConnection.ExecuteAsync("insert into Stock(Symbol) values (?)", "MSFT");
            var stocks = _SQLiteDBConnection.QueryScalarsAsync<TableTest>("select * from Stock");
        }
        #endregion sql执行
    
        #region 添加表数据
        /// <summary>
        /// 新增数据
        /// </summary>
        /// <param name="tableTest">数据</param>
        /// <returns></returns>
        public int InsertTableDataDemo(TableTest tableTest)
        {
            return _SQLiteDBConnection.InsertAsync(tableTest).Result;
        }

        /// <summary>
        /// 新增多条表数据
        /// </summary>
        /// <param name="tableTests">数据</param>
        /// <param name="runInTransaction">是否使用事务</param>
        /// <returns></returns>
        public int InsertTableDatasDemo(List<TableTest> tableTests, bool runInTransaction = true)
        {
            return _SQLiteDBConnection.InsertAllAsync(tableTests, runInTransaction).Result;
        }
        
        #endregion 添加表数据

        #region 删除表数据
        /// <summary>
        /// 删除数据
        /// </summary>
        /// <param name="tableTest"></param>
        /// <returns></returns>
        public int DeleteTableDataDemo(TableTest tableTest)
        {
            return _SQLiteDBConnection.DeleteAsync(tableTest).Result;
        }
        #endregion 删除表数据

        #region 修改表数据
        /// <summary>
        /// 更新数据
        /// </summary>
        /// <param name="tableTest">数据</param>
        /// <returns></returns>
        public int UpdateTableDataDemo(TableTest tableTest)
        {
            return _SQLiteDBConnection.UpdateAsync(tableTest).Result;
        }

        /// <summary>
        /// 更新所有的表数据
        /// </summary>
        /// <param name="tableTests">数据</param>
        /// <param name="runInTransaction">是否使用事务</param>
        /// <returns></returns>
        public int UpdateAllTableDataDemo(List<TableTest> tableTests,bool runInTransaction = true)
        {
            return _SQLiteDBConnection.UpdateAllAsync(tableTests, runInTransaction).Result;
        }
        #endregion 修改表数据

        #region 查询表数据
        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="tableTest">条件</param>
        /// <returns></returns>
        public List<TableTest> QueryTableDataByWhere(TableTest tableTest)
        {
            return _SQLiteDBConnection.QueryAsync<TableTest>("select * from TableTest where Name=? and Pwd=?", tableTest.Name, tableTest.Pwd).Result;
        }

        /// <summary>
        /// 通过Id获取一条数据
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public TableTest GetTableDataById(int id)
        {
            return _SQLiteDBConnection.QueryAsync<TableTest>("select * from TableTest where Id=?", id).Result.FirstOrDefault();
        }

        /// <summary>
        /// 查询全部的数据
        /// 返回一个可供查询的表,后筛选
        /// </summary>
        /// <param name="tableTest">条件</param>
        /// <returns></returns>
        public List<TableTest> GetTableDataByWhere(TableTest tableTest=null)
        {
            if (tableTest !=null)
            {
                return _SQLiteDBConnection.Table<TableTest>().Where(t => t.Name == tableTest.Name).ToListAsync().Result;
            }
            else
            {
                return _SQLiteDBConnection.Table<TableTest>().ToListAsync().Result;
            }
        }
        #endregion 查询表数据

        #region 事务
        // 执行事务
        public void RunInTransactionAsync()
        {
            // 操作
            TableTest insertObj = new();
            TableTest updateObj = new();
            TableTest deleteObj = new();

             _SQLiteDBConnection.RunInTransactionAsync(tran =>
            {
                // database calls inside the transaction
                tran.Insert(insertObj);
                tran.Update(updateObj);
                tran.Delete(deleteObj);
            });
        }
        #endregion 事务

        #region 创建表
        /// <summary>
        /// 创建表
        /// </summary>
        public void CtreatTableDemo()
        {
            _SQLiteDBConnection.CreateTableAsync<TableTest>();
        }
        #endregion 创建表

        #region 删除表
        /// <summary>
        /// 删除表
        /// </summary>
        public void DropTableDemo()
        {
            _SQLiteDBConnection.DropTableAsync<TableTest>();
        }

        #endregion 删除表

        #region 添加列或修改列、删除列结构;添加、删除索引
        /// <summary>
        /// 添加列或修改列结构
        /// </summary>
        public void ModifyColumnsForTableDemo()
        {
            _SQLiteDBConnection.CreateTableAsync<TableTest>();
        }
        #endregion 添加列或修改列、删除列结构;

        #region 添加、删除索引(可以用特征指定)
        /// <summary>
        /// 创建索引
        /// </summary>
        public int CreateIndexAsync()
        {
            TableTest tableTest = new();
            string indexName = "TTName_Index";  // 索引名
            bool unique = false;  // 是否唯一索引

            //return _SQLiteDBConnection.CreateIndexAsync(nameof(TableTest), nameof(tableTest.Name), unique).Result;  // 单个列索引
            return _SQLiteDBConnection.CreateIndexAsync(indexName, nameof(TableTest), nameof(tableTest.Name), unique).Result;  // 单个列索引_指定索引名
            //return _SQLiteDBConnection.CreateIndexAsync(nameof(TableTest),new string[] { nameof(tableTest.Name), nameof(tableTest.Pwd), nameof(tableTest.Description) }, unique).Result;  // 多个列索引
        }

        #endregion 添加、删除索引(可以用特征指定)
    }
}

 

posted @   ꧁执笔小白꧂  阅读(1400)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示