# SaveTools使用手册 --- 注:SaveTools 目前因为接口反复修改的关系,Load方法增加对象的返回值以提供更多的操作方法。下面Not Complete表示该部分功能并未开发完毕。 ```mermaid mindmap root((SaveTools)) Data CSV LiteDB Dapper MySql Sqlite File FTP SFTP LocalFileSystem WebDav - Not Complete Object Json Redis Byte - Not Complete ``` ## 支持的数据类型 - `Object` 对象类型的存储类型,通过key-value的方式获取对应的对象,常见的例子有Json,Redis等等。 - `Data` 数据类型的存储类型,同样通过key-Table的方式获取对应的数据表,通常为各种类型的数据库,比如MySql,Sqlite,LiteDB,CSV表格文件等等。 - `File` 文件类型的存储类型,提供对应的下载,上传接口以及各类文件系统管理接口,通常为各种文件共享服务,比如FTP,WebDav,本地文件系统等等。 ## 加载存储管理对象(可读可写) Load为可读写存储对象的加载,通常是用Path,或者数据库地址来进行实例化。 以SQLite数据库为例 ```csharp EGSqliteSave SqliteTest = this.EGSave().Load("SaveData/test.db"); ``` 具体使用方法详见API - IEGSaveData部分。 ## 读取存储管理对象(只读) Read为只读存储对象的加载,通常以字符&字节流的方式来获取,由于是只读数据,仅包含相关数据的搜索,获取功能。 以Json为例 ```csharp string json = @"{ 'CPU': 'Intel', 'PSU': '500W', 'Drives': [ 'DVD read/writer' /*(broken)*/, '500 gigabyte hard drive', '200 gigabyte hard drive' ], 'My' : { 'AA':'BB', 'Date': new Date(123456789) } }"; EGJsonSave jsonManage = this.EGSave().Read("Example", json); GD.Print(jsonManage.GetObject("CPU")); ``` ## 数据库增删改查 针对Data型的存储类型,可以简单实现数据库的增删改查,同时可使用Database的建表操作完成数据库的初始化。 首先我们定义两个结构类型,其一是符合类型,带相关对象的: ```csharp public struct DataStudent { public int ID; public string Name { get; set; } public int Age; public EGPathSelect Path { set; get; } public DataStudent(string name, int age) { Name = name; Age = age; ID = 0; Path = new EGPathSelect(); } } ``` 其二是只包含原始类型(IsPrimitive)和string类型的结构,其中类结构里面的所有属性(除了主键ID自增外)皆为属性类型。 ```csharp public struct DataStu { public int ID; public string Name { get; set; } public int Age { set; get; } public string Path { set; get; } public DataStu(string name, int age,string path) { Name = name; Age = age; ID = 0; Path = path; } } ``` 后面我们会讲到两种类型兼容方面的差异,第一种仅支持单项操作,复数操作无法很好的兼容,第二种则支持复数操作(适用于数据批量导入,备份功能的定制)。 以MySQL为例: ### 数据库连接 ```csharp EGDapper mysqlSave = this.EGSave().Load("server=" + "localhost" + ";port=" + "3306" + ";uid=" + "root" + ";pwd=" + "root" + ";database=" + "Test3" + ";"); ``` 或者 ```csharp EGMysqlSave mysqlSave = this.EGSave().Load("server=" + "localhost" + ";port=" + "3306" + ";uid=" + "root" + ";pwd=" + "root" + ";database=" + "Test3" + ";"); ``` ### 查询表名是否存在 ```csharp bool isExist = mysqlSave.ContainsKey("DataStudent"); GD.Print(isExist); ``` ### 查询对应ID的条目是否存在 ```csharp bool isExist = mysqlSave.ContainsData("DataStudent",3); GD.Print(isExist); ``` ### 初始化表 如果包含复合对象的,比如其它类对象的声明(例如上面的 EGPathSelect),此选项创建的字段为varchar(255),同String。 ```csharp mysqlSave.CreateTable("DataStudent"); ``` ### 增加数据 关于Path属性,会根据该类的ToString()方法,插入到表格对应的Path字段中。 ```csharp DataStudent stuData = new DataStudent("Bob", 12); stuData.Path = new EGPathSelect(){Path = "AA"}; mysqlSave.AddData("DataStudent",stuData); ``` 或者 ```csharp DataStu stu1 = new DataStu("Anti", 20,"London"); mysqlSave.AddData("DataStudent",stu1); ``` ### 批量增加数据 注意,批量增加数据时,需要保证对象结构必须包含表字段的所有非空属性(此框架提供的建表方法字段默认非空)。其中类结构里面的所有属性(除了主键ID自增外)皆为属性类型。 ```csharp DataStu stu2 = new DataStu("CC", 23,"NewYork"){Age = 19}; DataStu stu3 = new DataStu("Rocket", 24,"Paris"){Age = 26}; List stuList = new List(); stuList.Add(stu2); stuList.Add(stu3); mysqlSave.AddData("DataStudent",stuList); ``` ### 删除数据(通过ID) 删除ID为2的一条数据(可配合FindData找到要删除的内容的ID,实现批量删除) ```csharp mysqlSave.RemoveData("DataStudent",2); ``` ### 查找数据(通过表达式) 查找Name为CC的数据 ```csharp IEnumerable findStudent = mysqlSave.FindData("DataStudent", e => e.Name == "CC"); GD.Print(findStudent.Count() +" data has been find!"); foreach (DataStu stu in findStudent) { GD.Print(stu.Path); } ``` ### 查找数据(通过关键词) 查找Name包含C的数据,注意:通过关键词查找的数据大小写不敏感,包含小写c也会被检索出来 ```csharp IEnumerable findStudent = mysqlSave.FindData("DataStudent","Name","C"); GD.Print(findStudent.Count() +" data has been find!"); foreach (DataStu stu in findStudent) { GD.Print(stu.Path); } ``` ### 修改数据 查找所有Name字段包含CC的数据,并给名称增加编号。 ```csharp IEnumerable findStudent = mysqlSave.FindData("DataStudent","Name","CC"); GD.Print(findStudent.Count() +" data has been find!"); int count = 0; foreach (DataStu stu in findStudent) { DataStu NewData = new DataStu("CC_" + count, stu.Age, stu.Path); mysqlSave.UpdateData("DataStudent", NewData, stu.ID); count++; } ``` ## 开发计划(随版本更新) Object: - [x] Json - [x] Redis - [ ] Byte - [ ] etc... Data: - [x] LiteDB - [x] Dapper - [x] Sqlite - [x] MySql - [x] Csv - [ ] etc... File: - [x] LocalFile - [x] Ftp - [x] SFtp - [ ] WebDav - [ ] etc... # 使用案例 ## 配置文件写入与加载 ## 简易背包 ## 使用CQRS实现可追溯的文件操作