为什么选择LiteDB

之前做uwp的时候有做过一个植物图鉴,当时图片使用的是在线图片,所以图片很多也并没有什么体验上的差别,但是直到有一天别人的网站挂掉了,图片访问不到了,当时想访问不到也没啥,反正图片都被我爬到本地了,于是就把图片统统放在Assets目录里,把url改了下就启动了。

可是事实很尴尬,也不知道uwp是怎么访问Assets目录的文件,总之启动很卡,仿佛每次启动都会遍历一遍Assets的文件一样,所以我天真的感觉改个目录就行的方式不行了,PS(当时使用的是sqlite加ef存储的数据),显然旧方法不行就要想新方法了。

查了下文档,sqlite也能存储文件,为什么我没选择继续用sqlite呢?主要是因为ef的最新版本不支持uwp了,旧版本我也不想用了,刚好在很久的时候也读到了h大佬的一篇讲LiteDB的文章,于是脑子里就出现了LiteDB这个选项。

强烈建议先看H佬的文章

h82258652 【UWP】使用 LiteDB 存储数据

另外一点平时公司使用的数据库也是MongoDB,在我看了LiteDB的api之后,发现它的风格和MongoDB的api风格很像,刚好使用起来也比较方便。废话少说,先来张图鉴图片看看效果。

demo源码地址-WinUI.UseLiteDB

WinUI使用LiteDB的上手体验

首先我们先创建一个WinUI的项目,然后安装名称为LiteDB的nuget包,如下图。

项目本身没什么特别的,主要是采用CommunityToolkit控件库里的AdaptiveGridView控件结合MVVM进行数据的加载展示。

AdaptiveGridView绑定ViewModel里的属性,属性通过CommunityToolkit提供的增量加载集合IncrementalLoadingCollection进行服务的绑定,主要逻辑在PersonalInfoSource实现。

通过针对LiteDB数据操作的封装,我们就可以在PersonalInfoSource服务里调用IPersonalInfoRepository仓储接口,对应的实现就是封装了LiteDB的增删改查,包含图片文件的存储。

主要涉及到LiteDatabase类的GetCollection方法,不同的Collection我们可以认为是不同的表,针对某个Collection的插入读取就相当于针对单表的插入和读取。

图片文件的存储涉及到GetStorage方法,这个我们可以根据需要命名,如上图我们可以通过Upload方法将图片存储到数据库文件。

图上的方法把数据存储成功了,我们读取的时候操作也类似,通过Collection将数据读出,然后针对图片文件读取成流,放到对象里。

   public Task<IReadOnlyCollection<PersonalInfo>> GetListAsync(
int pageIndex, int pageSize, CancellationToken cancellationToken = default)
{
var query = _liteDatabase.GetCollection<PersonalInfo>().Query(); var list = query
.OrderByDescending(p => p.Name)
.Skip((pageIndex) * pageSize)
.Limit(pageSize)
.ToList(); if (list != null && list.Count > 0)
{
var fs = _liteDatabase.GetStorage<string>("dataFiles", "dataChunks"); foreach (var item in list)
{
if (fs.Exists($"$/Data/{item.AvatarName}"))
{
LiteFileInfo<string> file = fs.FindById($"$/Data/{item.AvatarName}"); Stream stream = new MemoryStream(); fs.Download(file.Id, stream); stream.Seek(0, SeekOrigin.Begin); item.AvatarStream = stream;
}
}
} return Task.FromResult((IReadOnlyCollection<PersonalInfo>)list);
}

流的读取主要涉及到Download方法,针对流可以执行stream.Seek(0, SeekOrigin.Begin);

这部分的代码我参考了一个uwp的demo地址如下:

UWP-LiteDB-Sample

现在我们获取到了列表信息和图片流,只要在展示的时候处理下,就可以绑定到AdaptiveGridView,将流转换成BitmapImage就可以展示到界面上了。

看到这里整体的使用过程就算是结束了,感觉上和uwp使用没什么区别,毕竟WinUI算是继承了uwp的衣钵。

再次提供demo源码地址连接,点击这里就行

XAML代码如图

WinUI可以期待些什么

demo我使用的是WinUI 1.0的版本,目前1.1版本正在预览,添加很多新特性,如下图:

整体可以期待的是winui替代uwp的那一天吧,不过目前看来uwp还是可以很长命的,因为winui目前好像还不支持xbox,而且c# .net版本的winui目前启动速度也是有点慢。目前如果开发的应用不复杂,替代wpf还是可以的。

推荐的项目地址如下:

WindowsAppSDK

WindowsCommunityToolkit

LiteDB - A .NET NoSQL Document Store in a single data file

WinUI使用LiteDB做个女演员图鉴的更多相关文章

  1. 分享一个LiteDB做的简单考试系统辅助工具

    凌晨,被安排在公司值班,因为台风“灿鸿”即将登陆,风力太大,办公楼,车间等重要部分需要关注.所以无聊,那就分享一下,今天给朋友临时做的一个小的考试系统辅助工具吧.其实非常小,需求也很简单,但是可以根据 ...

  2. 新概念英语(1-127)A famous actoress(女演员)

    A:Can you recognize that woman, Liz ?B:I think I can, Kate. It must be Karen Marsh, the actoress.A:I ...

  3. 两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置

    序:一年多没更新博客园的内容了,core已经发生了翻天覆地的变化,想起2014年这时候,我就开始了从当时还叫k的那套preview都不如的vnext搭建这套系统,陆陆续续它每一次升级,我也相应地折腾, ...

  4. [No000007]搜索引擎以图搜图的原理

    之前,Google把"相似图片搜索"正式放上了首页. 你可以用一张图片,搜索互联网上所有与它相似的图片.点击搜索框中照相机的图标. 一个对话框会出现. 你输入网片的网址,或者直接上 ...

  5. Serenity框架官方文档翻译3.1(教程)

    3.教程 3.1教程: Movie Database 我们来用Serenity创建一个和IMDB相似的编辑界面的站点. 你能在下面的站点找到教程的源代码: https://github.com/vol ...

  6. 膜拜一个神奇的女人——Hedy Lamarr

    她演绎了首部露点电影.经历了六次婚姻.出版了首本自曝隐私的自传,还曾入室行窃过两次——在这样一个饱受争议的大环境下,她还能在60多年前提出“跳频”技术和一系列无线信号技术的全新概念,其中,“跳频”技术 ...

  7. Java阶段性测试--第四五六大题参考代码

    第四题:.此题要求用IO流完成 使用File类在D盘下创建目录myFiles, 并在myFiles目录下创建三个文件分别为:info1.txt, info2.txt, info3.txt . 代码: ...

  8. Java阶段性测试--知识点:数组,面向对象,集合、线程,IO流

    #Java基础测试 涉及知识点:数组,面向对象,重载,重写,继承,集合,排序,线程,文件流 一.多项选择题(可能是单选,也可能是多选) 1.下列标识符命名不合法的是(   D  ). A.$_Name ...

  9. 使用Node.js实现简易MVC框架

    在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...

随机推荐

  1. mybatis缓存-二级缓存

    1.2 二级缓存 [官方声明] => 如何开启[二级缓存] 默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存. 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行 ...

  2. 羽夏逆向指引—— Hook

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的, ...

  3. 什么是 NetflixFeign?它的优点是什么?

    Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 启发的 java 客户端联编程序.Feign 的第一个目标是将约束分母的复杂性统一到 http apis,而不考虑其稳定 ...

  4. Oracle入门基础(十二)一一储存过程及触发器

    1.第一个存储过程 打印Hello World 调用存储过程: 1.exec sayhelloworld(); 2.begin sayhelloworld(); sayhelloworld(); en ...

  5. java 中有几种方法可以实现一个线程?

    继承 Thread 类 实现 Runnable 接口 实现 Callable 接口,需要实现的是 call() 方法

  6. 学习ELK日志平台(一)

    一.需求及基础: 场景: 1.开发人员不能登录线上服务器查看详细日志 2.各个系统都有日志,日志数据分散难以查找 3.日志数据量大,查询速度慢,或者数据不够实时 4.一个调用会涉及到多个系统,难以在这 ...

  7. BMZCTF ssrfme

    <?php if(isset($_GET) && !empty($_GET)){ $url = $_GET['file']; $path = "upload/" ...

  8. ctfhub web信息泄露备份文件下载(网站源码,back文件)

    网站源码 进入环境,首先我们用bp抓一下包 在HTTP请求方式GET/后添加两个负载,一个用于爆破文件名,一个用于爆破后缀名 得知网页源码的备份形式为www.zip,下载网页源码 打开记事本文件 发现 ...

  9. c语言实现两数交换的三种方法

    实现变量的值互相交换的三种不同方法 方法一:利用第三个变量来实现数值的交换 int tmp; tmp = a; a = b; b = tmp; 此方法直观,简易.不易出错,推荐使用 方法二:利用两个变 ...

  10. h4ck47h0n ? h4ck3r ? I"m just a coder......

    [0x00]刚开了专栏,没事过来投投稿混眼熟啦~//才不是为了抱枕呢刚刚结束了黑客马拉松,回来也是缓了好久才缓过来.这么高强度的脑洞劳动···阿不,是脑力劳动的说.真的第一次.说起来,跟代码相识,还是 ...