WPF项目实战视频《二》(主要为prism框架)
14.prism框架知识(1)
使用在多个平台的MVVM框架
新建WPF项目prismDemo
项目中:工具-NuGet包管理:安装Prism.DryIoc框架
在git中能看Prism的结构和源代码:git链接地址
例如:Prism/src/Wpf/Prism.DryIoc.Wpf/PrismApplication.cs这个类,就是在我们自己的prismDemo项目中需要更改继承使用。

报错:加上(更改)以下三行,重新生成并实现抽象类,上图报错即解决。

抽象类的实现:

管理扩展:添加"Prism Template Pack",就不用每次新建项目都添加一次prism了
添加扩展之后重新打开VS,新建项目:

打开之后就包含有prism和一些项目文件结构:

15.prism区域介绍(2)
主要内容:区域的概念和使用方法。
prism界面(.xaml文件中)中划分区域,可放入容器或者控件(动态的)
在.xaml中加入不同的子模块:(添加xsml子模块-主页面.png)

在views中新加三个用户控件:page1,page2,page3
现需要点击不同的按钮进入不同的页面:在ViewModels文件夹中修改MainWindowViewModel.cs文件:
public class MainWindowViewModel : BindableBase
{//执行不同的模块public DelegateCommand<string> OpenCommand { get; private set; }public MainWindowViewModel(){//执行不同的模块OpenCommand = new DelegateCommand<string>(Open);}private void Open(string obj){switch (obj){case "viewA": break;case "viewB": break;case "viewC": break;}}
}
绑定:.xaml中加入Content参数,进行绑定,传递参数用:CommandParameter参数
<StackPanel Orientation="Horizontal"><Button Margin="5" Content="打开模块A" Command="{Binding OpenCommand}" CommandParameter="viewA"/><Button Margin="5" Content="打开模块B" Command="{Binding OpenCommand}" CommandParameter="viewB"/><Button Margin="5" Content="打开模块C" Command="{Binding OpenCommand}" CommandParameter="viewC"/></StackPanel><!--需要在.cs文件中连接需要使用Content--><ContentControl Grid.Row="1" Content="{Binding Body}"/>
连接的Body的使用方式:在MainWindowViewModel.cs文件中
//定义一个跟MainWindow.xaml中绑定对应的Body
private object body;
public object Body
{get { return body; }set { body = value; RaisePropertyChanged(); }
}
....
//使用:
private void Open(string obj)
{switch (obj){case "viewA": Body = new Page1(); break; //此处使用case "viewB": Body = new Page2(); break; //此处使用case "viewC": Body = new Page3(); break; //此处使用}
}
(以上使用到Prism框架的自动查找上下文功能(views – viewModels))功能完成。
发现问题:view页面和viewModel后端处理,耦合性较大。需要降低耦合性------解决方式:使用prism插件:

在MainWindow.xaml中,需要注意prism的扩展插件自动生成了以下代码,注意不要重复添加,会报错。
<ContentControl prism:RegionManager.RegionName="ContentRegion"/>
<!--ui界面第二行内容-->
<!--需要在.cs文件中连接需要使用Content-->
<!--<ContentControl Grid.Row="1" Content="{Binding Body}"/>--><!--更改:使用prism的方式,降低耦合性,使用ContentRegion进行识别-->
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion"/>
MainWindowViewModel.cs文件中:
//执行不同的模块
public DelegateCommand<string> OpenCommand { get; private set; }private readonly IRegionManager regionManager;
//以下:使用prism的方式进行
public MainWindowViewModel(IRegionManager regionManager)
{//regionManager主要用于管理模块OpenCommand = new DelegateCommand<string>(Open);this.regionManager = regionManager;}
private void Open(string obj)
{//regionManager.Regions["ContentRegion"].RequestNavigate("Page1"); //依赖注入的形式(在App中进行同步修改)识别Page1regionManager.Regions["ContentRegion"].RequestNavigate(obj);
}
Open(string obj) 会根据button commmand的内容对应填入obj的值
<Button Margin="5" Content="打开模块A" Command="{Binding OpenCommand}" CommandParameter="Page1"/>
<Button Margin="5" Content="打开模块B" Command="{Binding OpenCommand}" CommandParameter="Page2"/>
<Button Margin="5" Content="打开模块C" Command="{Binding OpenCommand}" CommandParameter="Page3"/>
在App.xaml.cs中依赖注入使ViewA能被识别

以上就完成了,使用prism插件,使用依赖注入,完成点击按钮切换页面的功能。
总结:首先通过IRegionManager接口获取当全局定义的可用区域,然后往这个区域动态的设置内容,设置方式:依赖注入
16.prism模块化介绍(3)
项目开发时往往会分多个模块进行开发,多个文件夹,本质上也是一个类库。此处讲解如何添加程序集到主程序的容器中:
以新建项目类库为例:基于整个解决方案,新建两个WPF类库项目,分别命名为:ModelA,和ModelB。
在ModelA和ModelB中添加Views文件夹,在ModelA文件夹中添加用户控件ViewA,在ModelB文件夹中添加用户控件ViewB。
程序集被识别成模块的特征:新定义一个类ModuleAprofile.cs,项目中添加prism.dryIoc包之后,使ModuleAprofile继承自IModule,并实现对应的接口方法(函数内容可为空,但是必须实现)

在上文此.cs文件中的RegisterTypes函数中加入其依赖注入:(ModelB中同样步骤进行添加)
public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterForNavigation<ViewA>();
}
如何使之联系起来?:在主程序中加载ModuleA和ModuleB的方式有两种:一种是代码的方式,一种是配置文件的方式:
第一种:代码的方式
(此处需要注意使用插件创建的原始项目自动导入的是.net 6.0 而ModuleA和ModuleB导入的是8.0 需要版本变为一致,否则会报错。《项目->属性 中可修改版本》)
在主程序中加入项目引用,ModuleA和ModuleB
然后在App.xmls.cs中增加和修改:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{在此加入依赖注入//containerRegistry.RegisterForNavigation<Page1>(); //后面的小括号可以重命名名字,不填的话就为<>中的Page1//containerRegistry.RegisterForNavigation<Page2>();//containerRegistry.RegisterForNavigation<Page3>();
}//主程序中导入ModuleA和ModuleB,方法一:代码的模式
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{moduleCatalog.AddModule<ModuleAprofile>();moduleCatalog.AddModule<ModuleBprofile>();base.ConfigureModuleCatalog(moduleCatalog);
}
在主程序的页面MainWindow.xaml中:修改为对应的ViewA,ViewB
<StackPanel Orientation="Horizontal"><Button Margin="5" Content="打开模块A" Command="{Binding OpenCommand}" CommandParameter="ViewA"/><Button Margin="5" Content="打开模块B" Command="{Binding OpenCommand}" CommandParameter="ViewB"/><Button Margin="5" Content="打开模块C" Command="{Binding OpenCommand}" CommandParameter="Page3"/>
</StackPanel>
第二种:加载动态库dll的方式
在App.xmls.cs中增加和修改:
//第二种方式:加载动态库的方式CreateModuleCatalog
protected override IModuleCatalog CreateModuleCatalog()
{return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
}
把moduleA文件目录下bin下生成的ModelA.dll和对应的ModelB.dll放在主程序下的bin/debug目录下。
第三种:加载配置文件的方式
此不举例
17.prism导航功能(4)
之前的open有使用在区域之间进行模块的切换。此章详细讲解。
之前使用过的导航方式:
App.xaml:
protected override void RegisterTypes(IContainerRegistry containerRegistry){在此加入依赖注入containerRegistry.RegisterForNavigation<Page1>(); //后面的小括号可以重命名名字,不填的话就为<>中的Page1//containerRegistry.RegisterForNavigation<Page2>();//containerRegistry.RegisterForNavigation<Page3>();}
ModuleA和ModuleB项目分别添加ViewModels文件夹存放对应的ViewAViewModels.cs和ViewBViewModels.cs文件

需要在对应的view.xaml文件中加入prism自动识别

也可以手动的绑定:ModuleAprofile.cs中(较为常用)

绑定之后,就可以在对应viewmodule中实现对应的业务代码
添加导航的参数:
在主程序的module中MainWindowViewModel.cs文件,加入导航的参数

在ModuleA模块中识别出来:
使ModuleA下的ModuleAViewModules.cs 使之继承自INavigationAware然后实现其对应的接口

//添加数据有关的基类BindableBase
public class ViewAViewModules : BindableBase,INavigationAware
{private string title;public string Title{ //要注意这里不能使用默认的private 要改为public 否则回报错get { return title; } set { title = value; RaisePropertyChanged(); }}public bool IsNavigationTarget(NavigationContext navigationContext){//每次重新导航的时候,是否重用原来的实例return false; //这里使用true的话下次从ModelB切换到ModelA不会进行覆盖。//throw new NotImplementedException();}public void OnNavigatedFrom(NavigationContext navigationContext){//throw new NotImplementedException();//拦截导航请求}public void OnNavigatedTo(NavigationContext navigationContext){//throw new NotImplementedException();if(navigationContext.Parameters.ContainsKey("Title")) {//用来接收viewmodule传递的参数,传递什么类型就用什么类型接收Title = navigationContext.Parameters.GetValue<string>("Title");}}
}
使用OnNavigatedFrom进行导航拦截,在进行切换时会调用此函数
方式:之前ViewAViewModules继承自INavigationAware,可以改为IConfirmNavigationRequest,实现其接口ConfirmNavigationRequest,此接口主要用于验证是否允许切换
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{//验证是否允许切换//throw new NotImplementedException();bool result = true;if(MessageBox.Show("确认导航?","提示",MessageBoxButton.YesNo)==MessageBoxResult.No){//如果是no 那么result = false;}continuationCallback(result); //通过这个委托把这个结果(是否拦截导航)传进去
}
类似的导航功能还有:返回上一步:导航日志(此处省略)
18.prism对话服务(5)
也就是弹窗的功能。
在祝程序的MainWindow.xaml中,添加两个按钮进行弹窗触发。在主程序中添加窗口ViewAA.cs(以下图片上的ViewC都为ViewAA),在open函数中new此类,点击时则会有窗口出现。

但是特定的页面依赖于特定的实现,耦合度太高,这个问题如何去解决?-------依赖注入的方式(同上band).
将之前在主项目文件中创建的窗口ViewC.cs删掉,在ModuleA中新建一个用户控件ViewAA.cs,自定义控件的分布,提示和其他按钮。
<Grid><Grid.RowDefinitions><RowDefinition Height="auto" /><RowDefinition/><RowDefinition Height="auto" /></Grid.RowDefinitions><TextBlock Text="温馨提示" /><TextBlock Grid.Row="1" Text="hello~~~~" FontSize="80" VerticalAlignment="Center"/><StackPanel Orientation="Horizontal" Grid.Row="2"><!--水平排列--><Button Content="取消" /><Button Content="确认" /></StackPanel>
</Grid>

然后注入依赖:之前注入导航是:RegisterForNavigation 现在注入对话框是:RegisterDialog

加入ViewAA对应的ViewAAViewModules:继承自IDialogAware,然后点击实现对应接口。
public class ViewAAViewModules : IDialogAware
{//对话框//public string Title => throw new NotImplementedException();//修改,不抛异常public string Title { get; set; }public event Action<IDialogResult> RequestClose;public bool CanCloseDialog(){//允许被关闭return true;//throw new NotImplementedException();}public void OnDialogClosed(){//关闭窗口DialogParameters keys = new DialogParameters();keys.Add("Value", "viewAA:Dialog");RequestClose?.Invoke(new DialogResult(ButtonResult.OK, keys));//throw new NotImplementedException();}public void OnDialogOpened(IDialogParameters parameters){//接收弹窗中的参数//throw new NotImplementedException();}
}
然后在ModuleAprofile.cs注册依赖的地方,将viewAA和viewAAviewmodules进行绑定

对话框传递参数:主项目中MainWindowViewModel.cs中写入需要传递的参数。
//对话框
private readonly IDialogService dialogService;
public MainWindowViewModel(IDialogService dialogService)
{//regionManager主要用于管理模块OpenCommand = new DelegateCommand<string>(Open);this.dialogService = dialogService;}
private void Open(string obj)
{DialogParameters keys = new DialogParameters();keys.Add("Title", "测试弹窗"); //传递参数dialogService.ShowDialog(obj,keys,callback =>{//回调方法});
}
ViewAAViewModules中接收参数的函数OnDialogOpened修改:
public void OnDialogOpened(IDialogParameters parameters)
{//接收弹窗中的参数//throw new NotImplementedException();Title=parameters.GetValue<string>("Title");
}
点击【打开对话框A】,则显示“测试弹窗”-弹窗

现在把【确认/取消按钮加入对应的功能】:
ViewAAViewModules.cs写构造函数
public DelegateCommand CancelCommand { get; set; } //取消
public DelegateCommand SaveCommand { get; set; } //保存public ViewAAViewModules() {CancelCommand = new DelegateCommand(Cancel);SaveCommand = new DelegateCommand(Save);
}private void Save()
{//新生成方法-保存OnDialogClosed();
}private void Cancel()
{//新生成方法-取消RequestClose?.Invoke(new DialogResult(ButtonResult.No));
}
ViewAA给按钮中绑定command
<Button Content="取消" Command="{Binding CancelCommand}"/><Button Content="确认" Command="{Binding SaveCommand}" />
在之前MainWindowViewModel的回调函数中进行判断
private void Open(string obj){DialogParameters keys = new DialogParameters();keys.Add("Title", "测试弹窗");dialogService.ShowDialog(obj,keys,callback =>{//回调方法,点击之后获取点击的结果if (callback.Result == ButtonResult.OK) {//如果点击了ok那么获取传递的值string result = callback.Parameters.GetValue<string>("Value");}});}
实现点击确定按钮(OK)进行数据传递,点击取消按钮(NO)不做操作
好处:实现业务代码的简化,耦合性降低
19.prism发布订阅(6)
创建Event文件夹,创建一个新的类:MessageEvent.cs文件,消息模型。

使用:ViewAAViewModules.cs构造函数注入

例如,在ViewAA.xaml中,进行订阅:

进行测试:
修改ViewAAViewModules.cs

测试:ViewAAViewModules.cs点击取消按钮发布信号

实现效果:点击打开对话框A–》弹出测试弹窗 --》点击测试弹窗取消–》
弹出接收消息弹窗

取消订阅功能实现:点击取消,接收到消息之后取消该消息的订阅,则第二次点击取消按钮不会再弹窗。ViewAA.xaml.cs文件

扩展:也可以写复杂类型的对象:
namespace ModelA.Event
{public class MessageEvent:PubSubEvent<string >{//主要用来传递string类型的消息}public class TestEvent : PubSubEvent<Test>{}public class Test{public string Id { get; set; }public string Name { get; set; }}
}
相关文章:
WPF项目实战视频《二》(主要为prism框架)
14.prism框架知识(1) 使用在多个平台的MVVM框架 新建WPF项目prismDemo 项目中:工具-NuGet包管理:安装Prism.DryIoc框架 在git中能看Prism的结构和源代码:git链接地址 例如:Prism/src/Wpf/Prism.DryIoc.Wpf…...
【微信小程序实战教程】之微信小程序 WXS 语法详解
WXS语法 WXS是微信小程序的一套脚本语言,其特性包括:模块、变量、注释、运算符、语句、数据类型、基础类库等。在本章我们主要介绍WXS语言的特性与基本用法,以及 WXS 与 JavaScript 之间的不同之处。 1 WXS介绍 在微信小程序中,…...
Android中Service学习记录
目录 一 概述二 生命周期2.1 启动服务startService()2.2 绑定服务bindService()2.3 先启动后绑定2.4 先绑定后启动 三 使用3.1 本地服务(启动式)3.2 可通信的服务(绑定式)3.3 前台服务3.4 IntentService 总结参考 一 概述 Servic…...
Elasticsearch:Java ECS 日志记录 - log4j2
ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松将日志格式化为与 ECS 兼容的 JSON。ECS 兼容的 JSON 日志记录可以帮我们简化很多分析,可视化及解析的工作。在今天的文章里,我来详述如何在 Java 应用里生成 ECS 相兼容的日志。 …...
MongoDB自学笔记(四)
一、前文回顾 上一篇文章中我们学习了MongoDB中的更新方法,也学了一部分操作符。今天我们将学习最后一个操作“删除”。 二、删除 原始数据如下: 1、deleteOne 语法:db.collection.deleteOne(< query >,< options >) 具体参…...
时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解
时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解 目录 时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解效果一览基本介绍程序设计参考资料 效果一览…...
新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题
苹果CMS2022新版海螺影视主题M3.1版本,这个主题我挺喜欢的,之前也有朋友给我提供过原版主题,一直想要破解但是后来找了几个SG11解密的大哥都表示解密需要大几百大洋,所以一直被搁置了。这个版本是完全解密的,无需SG11加…...
汽车免拆诊断案例 | 2014 款上汽名爵 GT 车发动机无法起动
故障现象 一辆2014款上汽名爵GT车,搭载15S4G发动机,累计行驶里程约为18.4万km。该车因左前部发生碰撞事故进厂维修,更换损坏的部件后起动发动机,起动机运转有力,但无着机迹象。用故障检测仪检测,发现无法与…...
vue3前端开发-小兔鲜项目-登录功能的业务接口调用
vue3前端开发-小兔鲜项目-登录功能的业务接口调用!这次,正式调用远程服务器的登录接口了。大家要必须使用测试账号密码,才能验证我们的代码。 测试账号密码是:账号(xiaotuxian001);密码是(1234…...
【Linux】vim编辑器使用详解
目录 一、vim编辑器简介二、 vim编辑器使用指南1.基本操作1.进入与退出2.模式切换 2.命令模式1.移动光标2.选择文本(可视模式)3.删除文字4.复制粘贴5.替换6.撤销7.注释8.多文件窗口切换 3.底行模式1.列出每行的行号2.跳转到某行3.查找字符4.保存文件5.在…...
手机怎么设置不同的ip地址
在数字化日益深入的今天,智能手机已成为我们生活、工作和学习中不可或缺的设备。然而,随着网络应用的广泛和深入,我们有时需要为手机设置不同的IP地址来满足特定需求。比如,避免网络限制、提高网络安全、或者进行网络测试等。本文…...
SpringBoot读取配置的6种方式
在SpringBoot应用开发中,配置文件是不可或缺的一部分。它们帮助我们管理应用的运行时参数,使得应用的部署和维护变得更加灵活。SpringBoot提供了多种方式来读取配置文件,每种方式都有其适用场景和优缺点。本文将介绍六种常用的SpringBoot读取…...
1.1 openCv -- 介绍
OpenCV(开放源代码计算机视觉库:http://opencv.org)是一个开源库,包含了数百种计算机视觉算法。本文件描述了所谓的OpenCV 2.x API,这是一个本质上基于C++的API,与基于C的OpenCV 1.x API(C API已被弃用,并且自从OpenCV 2.4版本起不再使用“C”编译器进行测试)相对。 …...
探索PostgreSQL的GUI工具:提升数据库管理效率
在当今快速发展的技术世界中,数据库管理是任何软件开发项目的核心部分。PostgreSQL,作为一款功能强大的开源关系型数据库管理系统,因其稳定性、可靠性和高度的可扩展性而广受开发者和数据库管理员的青睐。然而,尽管PostgreSQL自带…...
【从零开始实现stm32无刷电机FOC】【实践】【5/7 stm32 adc外设的高级用法】
目录 采样时刻触发采样同步采样 点击查看本文开源的完整FOC工程 本节介绍的adc外设高级用法用于电机电流控制。 从前面几节可知,电机力矩来自于转子的q轴受磁力,而磁场强度与电流成正比,也就是说电机力矩与q轴电流成正相关,控制了…...
springcloud接入seata管理分布式事务
下载安装包 链接: seata 配置seata-server 文件上传Linux解压 压缩包我放在/usr/local/seata中 tar -zxvf seata-server-2.0.0.tar.gz修改配置文件 设置nacos为注册和配置中心 进入文件夹 cd /usr/local/seata/seata/conf修改application.yml文件 ...... ...... cons…...
Android APP 音视频(02)MediaProjection录屏与MediaCodec编码
说明: 此MediaProjection 录屏和编码实操主要针对Android12.0系统。通过MediaProjection获取屏幕数据,将数据通过mediacodec编码输出H264码流(使用ffmpeg播放),存储到sd卡上。 1 MediaProjection录屏与编码简介 这里…...
java中log4j.properties配置文件浅析
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可按keyvalue格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。 1、配置文件 Log4J配置文件的基本格式如下: #配置根Logger log4j.roo…...
RV1126 Linux 系统,接外设,时好时坏(二)排查问题的常用命令
在 RV1126 Linux 系统中,排查外设连接问题时,可以使用多种命令来诊断和调试。以下是一些常用的命令和工具: 1. 查看系统日志 dmesg: 显示内核环形缓冲区的消息,通常包含设备初始化、驱动加载和错误等信息。 dmesg | grep <设备名或相关关键字>journalctl: 查看系统…...
鸿蒙北向开发 DevEco Studio 4.1 下载安装傻瓜式教程
开篇 由于鸿蒙处于快速发展中,鸿蒙的api快速迭代更新,老版本的DevEco studio无法支持更新版本的api,因此华为官网放弃了老版本的维护.直接从华为开发者官网无法下载老版本,当前华为开发者官网已经推出next版本了 DevEco studio3.1安装教程 上述教程提供的华为开发者官网地址已经…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
