开源库学习
文章平均质量分 93
lcintj
这个作者很懒,什么都没留下…
展开
-
【WPF】Prism学习(四)
命令(Commands)实际上是一种事件处理器(EventHandler)。这意味着,如果一个命令被设计为异步执行,那么在命令还在执行的过程中,可能会被多次调用。原创 2024-11-16 11:38:50 · 541 阅读 · 0 评论 -
【WPF】Prism学习(三)
首先,你需要定义一个接口。原创 2024-11-16 11:36:29 · 303 阅读 · 0 评论 -
【WPF】Prism学习(二)
当用户与控件交互时,控件会自动调用目标命令,如果提供了命令参数,它将作为参数传递给命令的 Execute 方法。原创 2024-11-15 13:28:36 · 624 阅读 · 0 评论 -
【WPF】Prism库学习(一)
Prism是一个强大的框架,它通过提供一系列设计模式和跨平台的共享代码库,帮助开发者构建高质量的XAML应用程序。Prism 9的发布进一步强化了这一点,通过统一不同平台的API,使得代码迁移和重用变得更加容易。原创 2024-11-15 13:27:44 · 370 阅读 · 0 评论 -
【开源库学习】libodb库学习(十二)
当我们添加新的持久类或更改现有的持久类时,例如,通过添加或删除数据成员,存储新对象模型所需的数据库模式也会发生变化。同时,我们可能有包含现有数据的现有数据库。如果应用程序的新版本不需要处理旧数据库,那么模式创建功能就是您所需要的。然而,大多数应用程序都需要使用同一应用程序旧版本存储的数据。我们将称数据库模式演化为更新数据库以匹配对象模型中的更改的总体任务。模式演化通常由两个子任务组成:模式迁移和数据迁移。架构迁移会修改数据库架构,使其与当前对象模型相对应。例如,在关系数据库中,这可能需要添加或删除表和列。原创 2024-07-29 08:50:07 · 422 阅读 · 0 评论 -
【开源库学习】libodb库学习(十一)
考虑一下在上面的例子中,如果在我们等待用户输入的同时,另一个进程更新了该人的姓氏,会发生什么。一旦我们收到用户的输入,我们就会继续更新对象,用新的(正确)覆盖旧的年龄,用旧的(不正确)覆盖新的名称。也就是说,如果我们在数据库事务中加载一个对象并在同一事务中更新它,那么我们可以保证我们在数据库中更新的对象状态与我们加载的状态完全相同。在我们的示例中,这意味着在一个数据库事务中加载对象,等待用户输入,然后在另一个数据库交易中更新对象。最后,请注意,对于具有乐观并发模型的持久类,如果数据库中没有这样的对象,则。原创 2024-07-22 15:55:24 · 1034 阅读 · 0 评论 -
【开源库学习】libodb库学习(十)
ODB可以使用自定义会话实现,而不是默认的。应用程序提供自己的会话可能有多种原因。例如,应用程序可能已经包含对象缓存或注册表的概念,ODB可以重复使用。自定义会话还可以提供其他功能,例如自动更改跟踪、延迟数据库操作或对象驱逐。最后,使用的每线程会话方法可能并不适用于所有应用程序。例如,有些可能需要一个可以在多个线程之间共享的线程安全会话。有关通过保留对象的原始副本来实现自动更改跟踪的自定义会话的示例,请参阅odb-tests中的测试。要使用自定义会话,我们需要使用ODB编译器命令行选项指定其类型。原创 2024-07-22 15:54:58 · 1136 阅读 · 0 评论 -
【开源库学习】libodb库学习(九)
ODB视图是一个C++类或结构类型,它体现了一个或多个持久对象或数据库表或本机SQL查询执行结果的轻量级只读投影。视图的一些常见应用包括从数据库表的对象或列加载数据成员的子集,执行和处理任意SQL查询的结果,包括聚合查询和存储过程调用,以及使用对象关系或自定义连接条件连接多个对象和/或数据库表。许多关系数据库也定义了视图的概念。但是请注意,ODB视图不会映射到数据库视图。相反,默认情况下,ODB视图被映射到SQL SELECT查询。但是,如果需要,可以很容易地创建基于数据库视图的ODB视图。原创 2024-07-21 17:56:25 · 743 阅读 · 0 评论 -
【开源库学习】libodb库学习(八)
为什么我们需要将数据成员分组到不同的节?为什么在必要时不能独立加载和更新每个数据成员?这一要求的原因是,用单个数据库语句加载或更新一组数据成员比用单独的语句加载或升级每个数据成员要高效得多。因为ODB准备并缓存用于加载和更新持久对象的语句,所以为需要一起加载或更新的特定数据成员集生成自定义语句也不是一种可行的方法。原创 2024-07-21 17:55:53 · 701 阅读 · 0 评论 -
【开源库学习】libodb库学习(七)
在上面的例子中,employee和contractor类都继承了person基类的first_和last_数据成员以及first()和last()访问器。这种继承风格的一个共同特征,从现在开始称为重用继承,是基类中缺少虚拟函数和虚拟析构函数。同样,采用这种风格,应用程序代码通常是根据派生类而不是基类编写的。在C++中利用继承的第二种方法是通过公共接口提供多态行为。在这种情况下,基类定义了许多虚拟函数,通常还有一个虚拟析构函数,而派生类则提供了这些虚拟函数的特定实现。原创 2024-07-20 16:05:05 · 739 阅读 · 0 评论 -
【开源库学习】libodb库学习(六)
复合值的成员可以是其他值类型(简单或复合)、容器(第5章,“容器”)和指向对象的指针(第6章,“关系”)。同样,复合值类型可以在对象成员中使用,作为容器的元素,也可以作为另一种复合值类型的基础。特别是,复合值类型可以用作集合容器中的元素类型(第5.2节,“集合和多集合容器”),也可以用作映射容器中的键类型(第5.3节,“映射和多映射容器”)。用作容器元素的复合值类型不能包含其他容器,因为不允许使用容器的容器。它允许我们将现有的C++类型包装到一个类似容器的类中,该类可以是NULL,也可以包含包装类型的值。原创 2024-07-20 16:04:27 · 1054 阅读 · 0 评论 -
【开源库学习】libodb库学习(五)
虽然ODB运行时和配置文件库为大多数广泛使用的指针提供支持,但添加对自定义智能指针的支持也很容易。为了实现这一点,您需要为指针实现类模板专门化。第一步是确定指针类型,因为专门化的接口会根据指针类型而变化。支持的指针类型有:原始指针(原始指针或等效指针,即非托管指针)、唯一指针(不支持共享的智能指针)、共享指针(支持共享的智慧指针)和弱指针(共享指针的弱对应指针)。这些指针中的任何一个都可以是惰性的,这也会影响专门化的接口。原创 2024-07-19 08:57:32 · 751 阅读 · 0 评论 -
【开源库学习】libodb库学习(四)
虽然ODB运行时和配置文件库提供了对各种容器的支持,但也很容易持久化自定义容器类型或从其中创建更改跟踪版本。为了实现这一点,您需要为您的容器实现类模板专门化。首先,确定容器类型的容器类型(有序、集合、多集合、映射或多映射)。然后使用公共ODB运行时库(libodb)中的一个标准C++容器的专门化作为您自己实现的基础。一旦容器的容器特征专门化准备就绪,您将需要使用选项将其包含在ODB编译过程中,并使用选项将其包括在生成的头文件中。例如,假设我们有一个哈希表容器,我们在文件中实现了特征专门化。原创 2024-07-19 08:56:46 · 1115 阅读 · 0 评论 -
【开源库学习】libodb库学习(三)
如果我们不知道我们正在寻找的对象的标识符,我们可以使用查询在数据库中搜索符合特定条件的对象。ODB查询功能是可选的,我们需要使用ODB编译器选项显式请求生成必要的数据库支持代码。它编译良好,只有在数据库系统执行时才会触发错误。原创 2024-07-18 13:56:39 · 1438 阅读 · 0 评论 -
【开源库学习】libodb库学习(二)
前面的章节为我们提供了ODB的高级概述,并展示了如何使用它在数据库中存储C++对象。在本章中,我们将更详细地研究ODB对象持久性模型以及核心数据库API。我们将从第1节和第3节中的基本概念和术语开始,并继续讨论第4节中的odb::数据库类、第5节中的事务和第6节中的连接。本章的其余部分将讨论核心数据库操作,并在最后讨论ODB异常。在本章中,我们将继续使用和扩展我们在上一章中开发的person持久类。原创 2024-07-18 10:48:11 · 1036 阅读 · 0 评论 -
【开源库学习】libodb库学习(一)
使用传统的“Hello World”示例展示如何创建一个依赖于ODB进行对象持久化的简单C++应用程序。特别是,我们将讨论如何声明持久类、生成数据库支持代码以及编译和运行我们的应用程序。我们还将学习如何使对象持久化,加载、更新和删除持久化对象,以及在数据库中查询符合特定条件的持久化对象。该示例还展示了如何定义和使用视图,这是一种允许我们创建持久化对象、数据库表的投影,或处理本机SQL查询或存储过程调用结果的机制。原创 2024-07-17 16:03:13 · 1020 阅读 · 0 评论