ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

东北大学全栈开发课程笔记4

2021-11-01 20:32:24  阅读:182  来源: 互联网

标签:存储 string 东北大学 诗词 笔记 数据库 int 全栈 public


依赖1:mvvmlightlibs

依赖2:sqlite-net-pcl

Model层

  • Poetry.cs

/// <summary>
/// 诗词类。
/// </summary>
[SQLite.Table("works")]//将类和数据库表映射
public class Poetry {
    /// <summary>
    /// 主键。
    /// </summary>
    [SQLite.Column("id")]//映射到id列
    public int Id { get; set; }//可以使用prop快速生成框架
​
    /// <summary>
    /// 标题。
    /// </summary>
    [SQLite.Column("name")]
    public string Name { get; set; }
​
    /// <summary>
    /// 作者。
    /// </summary>
    [SQLite.Column("author_name")]
    public string AuthorName { get; set; }
​
    /// <summary>
    /// 朝代。
    /// </summary>
    [SQLite.Column("dynasty")]
    public string Dynasty { get; set; }
​
    /// <summary>
    /// 正文。
    /// </summary>
    [SQLite.Column("content")]
    public string Content { get; set; }
​
    private string _snippet;
​
    /// <summary>
    /// 预览。
    /// </summary>
    [SQLite.Ignore]//预览是算出来的,不和数据库映射,所以将其忽略
    public string Snippet =>
        _snippet ?? (_snippet
                     = Content.Split('。')[0]
                     .Replace("\r\n", " "));
    //正文以。进行切割,取第一句话
    //并将回车换行符替换为空格
}

Service层

  • IPoetryStorage.cs

/// <summary>
/// 诗词存储接口。
/// </summary>
public interface IPoetryStorage {
    /// <summary>
    /// 初始化诗词存储。
    /// </summary>
    Task InitializeAsync();//初始化数据库
​
    /// <summary>
    /// 诗词存储是否已经初始化。
    /// </summary>
    bool Initialized();//不能一直初始化,所以需要判断
​
    /// <summary>
    /// 获取一个诗词。
    /// </summary>
    /// <param name="id">诗词id。</param>
    Task<Poetry> GetPoetryAsync(int id);//只要读数据库了一定是异步操作
​
    /// <summary>
    /// 获取满足给定条件的诗词集合。
    /// </summary>
    /// <param name="where">Where条件。</param>
    /// <param name="skip">跳过数量。</param>
    /// <param name="take">获取数量。</param>
    Task<IList<Poetry>> GetPoetriesAsync(
        Expression<Func<Poetry, bool>> where, int skip, int take);
    //使用动态查询语句
    //是一个函数,参数是Poetry,返回值是bool型(满足or不满足条件)
}
  • PoetryStorage.cs

/// <summary>
/// 诗词存储。
/// </summary>
public class PoetryStorage : IPoetryStorage {
    /// <summary>
    /// 诗词存储。
    /// </summary>
    /// <param name="preferenceStorage">偏好存储。</param>
    public PoetryStorage(IPreferenceStorage preferenceStorage) {
        _preferenceStorage = preferenceStorage;
    }
​
    /// <summary>
    /// 偏好存储。
    /// </summary>
    private IPreferenceStorage _preferenceStorage;
​
    /// <summary>
    /// 数据库名。
    /// </summary>
    private const string DbName = "poetrydb.sqlite3";
​
    /// <summary>
    /// 诗词数据库路径。
    /// </summary>
    public static readonly string PoetryDbPath =
        Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder
                                  .LocalApplicationData), DbName);
    //连接路径和数据库名=数据库文件路径
    //计算得到的数值不能是const常量,需要使用static readonly变成常量
    //static表示一个类中该变量只有一份(类级别),readonly表示只读只能被赋值一次
​
    /// <summary>
    /// 数据库版本。
    /// </summary>
    public const int Version = 1;
​
    /// <summary>
    /// 数据库版本键。
    /// </summary>
    public const string VersionKey =
        nameof(PoetryStorage) + "." + nameof(Version);
    //因为偏好存储是kv键值存储,所以键"PoetryStorage.Version"
​
    /// <summary>
    /// 数据库连接影子变量。
    /// </summary>
    private SQLiteAsyncConnection _connection;
    //打开连接
​
    /// <summary>
    /// 数据库连接。
    /// </summary>
    private SQLiteAsyncConnection Connection =>
        _connection ??
        (_connection = new SQLiteAsyncConnection(PoetryDbPath));
​
​
    /// <summary>
    /// 初始化诗词存储。
    /// </summary>
    public async Task InitializeAsync() {
        using (var dbFileStream =
               new FileStream(PoetryDbPath, FileMode.Create))
            using (var dbAssertStream = Assembly.GetExecutingAssembly()
                   .GetManifestResourceStream(DbName)) {
            await dbAssertStream.CopyToAsync(dbFileStream);
        }
​
        _preferenceStorage.Set(VersionKey, Version);
    }
    //using()会自动帮你关闭流
    //先打开文件流,再打开资源流(从项目里读出来的数据库二进制文件)
    //省略外层using的大括号
    //将来源文件流(dbAssertStream)拷贝到目标文件流(dbFileStream)中
    //向偏好存储中存版本号kv
​
    /// <summary>
    /// 诗词存储是否已经初始化。
    /// </summary>
    public bool Initialized() =>
        _preferenceStorage.Get(VersionKey, -1) == Version;
    //通过读偏好存储中的版本号是否等于当前版本号,来判断是否初始化
​
    /// <summary>
    /// 获取一个诗词。
    /// </summary>
    /// <param name="id">诗词id。</param>
    public async Task<Poetry> GetPoetryAsync(int id) =>
        await Connection.Table<Poetry>().Where(p => p.Id == id)
        .FirstOrDefaultAsync();
    //打开Poetry表,输入条件,获取第一个满足条件的诗词
​
    /// <summary>
    /// 获取满足给定条件的诗词集合。
    /// </summary>
    /// <param name="where">Where条件。</param>
    /// <param name="skip">跳过数量。</param>
    /// <param name="take">获取数量。</param>
    public async Task<IList<Poetry>> GetPoetriesAsync(
        Expression<Func<Poetry, bool>> @where, int skip, int take) =>
        await Connection.Table<Poetry>().Where(@where).Skip(skip).Take(take)
        .ToListAsync();
    //打开Poetry表,使用Where,Skip,Take函数传递参数,获取满足条件的诗词集合
}

标签:存储,string,东北大学,诗词,笔记,数据库,int,全栈,public
来源: https://blog.csdn.net/Y_ooo/article/details/121087858

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有