天道酬勤,学无止境

我可以设置瞬态属性来获取吗?(Can I set transient properties to fetch?)

问题

我想创建NSFetchRequest并将属性设置为这样获取:

request.propertiesToFetch = @[@"a", @"b", @"c"];

其中ab存储在 Core Data 数据库中, c是暂时的。 executeFetchRequest:触发错误Invalid keypath c passed to setPropertiesToFetch: 。 但是,如果我取消选中属性c瞬态复选框,一切都会正常工作。 那么真的不可能获取瞬态属性还是我做错了什么?

回答1

是的,这真的不可能。 您无法获取它们,因为它们不存在于持久存储中 - 这就是瞬态的含义。 您可以获取创建派生、瞬态属性的任何持久属性。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Xlib 和 Firefox 行为(Xlib and Firefox behavior)
    问题 我正在尝试创建一个小窗口管理器(只是为了好玩),但是我在处理由 Firefox 创建的窗口时遇到了问题(仅使用该应用程序,其他应用程序可以正常工作) 问题是,在我启动 Firefox 并添加我的装饰后,它似乎工作正常,但是例如,如果我尝试单击菜单按钮,则(子)窗口不会出现。 似乎发生的事情是在单击后,会使用以下值触发 ClientMessage 事件: Data: (null) Data: _NET_WM_STATE_HIDDEN Data: (null) Data: (null) Data: (null) 现在的问题是我不知道如何显示窗口,哪个窗口。 我试过: XRaiseWindow XMap窗口我试图获取瞬态窗口并显示它 但没有成功。 我不明白的是,此客户端消息是否由菜单子窗口生成。 我应该如何显示 _NET_WM_STATE_HIDDEN 中的窗口? 另一个奇怪的问题是,收到ClientMessage后,总是收到2个UnMapNotify Events。 我还有另一个问题,如果我想显示“文件,编辑”菜单(在 Firefox 中,如果我没记错的话,当你按下 Alt 按钮时它会出现。 也许 Firefox 创建了一个窗口树? 这是我处理事件的循环: while(1){ XNextEvent(display, &local_event); switch(local
  • CoreData Swift和瞬态属性获取器(CoreData Swift and transient attribute getters)
    问题 在Swift中使用Core Data时,关于实现计算属性的任何建议吗? 使用生成的ManagedObject类,我尝试覆盖getter,但出现错误: 计算属性上不允许使用“ NSManaged” 这意味着您不能覆盖瞬态(计算)属性的吸气剂。 在下面的代码示例中, dateDue在我的模型中定义为瞬态属性。 请注意,@NSManaged行是由Xcode生成的-不是我添加的。 @NSManaged var timeStamp: NSDate @NSManaged var dateDue: String { get { self.willAccessValueForKey("dateDue") var ddtmp = self.primitiveValueForKey("dateDue") as String? self.didAccessValueForKey("dateDue") if (ddtmp == nil) { let calendar = NSCalendar.currentCalendar() let components = calendar.components((NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit ) , fromDate: self.timeStamp)
  • Spring Data JPA - 如何在检索后设置瞬态字段(Spring Data JPA - how to set transient fields after retrieval)
    问题 在使用 Spring Data JPA 的JpaRepository方法获取实体后,例如findOne 、 findBy...等,我想知道自动执行一些自定义代码的最佳方法是什么,比如初始化一些瞬态字段。 换句话说,假设我有一个带有fullName瞬态字段的 User 实体,它应该在从数据库中获取后设置为firstName和lastName的串联,我该怎么办? 回答1 首先,如果你想要全名的话,只需编写一个方法来即时连接名字/姓氏。 它不一定是一个字段。 如果你真的需要对实体加载做一些处理,那么注册一个@PostLoad实体生命周期回调: public class MyEntity{ @PostLoad //invoked by framework on entity load. public void doStuff(){ fullName = forename + " " + surname; } //alternative public String getFullName(){ return forename + " " + surname; } https://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Example_of_Entity_event_annotations 回答2 您可以使用
  • 如何在休眠状态下识别对象是暂时的还是分离的?(How to identify an object is transient or detached in hibernate?)
    问题 我知道瞬态实例意味着该实例是新创建的,并且其对应的行在数据库中不存在,而分离的实例在数据库中具有相应的条目,但目前与任何会话都没有关联。 有什么方法可以使用 Session 上的任何方法或以编程方式在休眠中使用其他方法来识别对象是暂时的还是分离的? 回答1 听起来您正在寻找 EntityManager#contains(Object)。 检查该实例是否是属于当前持久化上下文的托管实体实例。 回答2 马特建议只会检查给定的对象是否是瞬态的或与某个实体管理器相关联。 如果你想检查它是分离的还是暂时的(你真的不应该关心!它应该是透明的)你需要检查给定的对象是否有一个 ID。 if(data.getID() == null) return TRANSIENT; 应该只为持久/分离的对象设置 ID。 如果由于某种原因您自己在瞬态对象上设置 ID,那么我认为您想要做的事情是不可能的。 如果您不知道哪个字段是 ID(出于某种原因)或者您想使其通用,您可以尝试: ClassMetadata metadata = HibernateUtil.getSessionFactory().getClassMetadata(data.getClass()); if(metadata.getIdentifier(data) == null) return TRANSIENT; 回答3 为了检查对象 e
  • 可序列化和瞬态(Serializable and transient)
    问题 为了使一个类可序列化,我们执行以下操作: class A implements Serializable { transient Object a; } 而不是这样: serializable class A { transient Object a; } 为什么要使类可序列化,为什么要实现一个特殊的接口。 如果要排除某些字段,可以使用关键字transient ? 为什么在两种情况下都没有使用特殊关键字? 我的意思是说,有什么理由以不同的方式制造同一件东西吗? 我知道,没有诸如serializable这样的关键字,但是为什么不引入它而不是特殊的接口Serializable? 回答1 为什么也没有使用一些特殊的关键字将类标记为可序列化呢? 可序列化的界面在代码中看起来像个魔术数字,而不是语言功能。 我认为您必须以另一种方式看待它:语言关键字的存在主要是为了支持编译时语言构造。 序列化是一种运行时机制。 此外,您不想为所有内容都添加一个额外的关键字,因为这样您就不能将其用作标识符。 另一方面,标记器界面的侵入性要小得多。 因此,问题是:为什么我们需要一个language关键字来标记瞬态字段? 答案是,那时根本没有其他方法可以标记特定字段。 如今,在这两种情况下(以及其他晦涩的strictfp关键字),都将为此目的使用注释。 回答2 Serializable是标记接口。
  • Grails:在地图构造函数中设置瞬态字段(Grails: setting transient fields in the map constructor)
    问题 我正在尝试将属性的Maps保留为单个JSON编码的列,如本问题所示。 我遇到的问题是,显然无法在默认地图构造函数中设置瞬时属性。 给定任何瞬态场: class Test { //... String foo static transients = ['foo'] } 似乎地图构造函数(Grails以各种方式覆盖)只是丢弃了瞬态字段: groovy:000> t = new Test(foo:'bar') ===> Test : (unsaved) groovy:000> t.foo ===> null 虽然直接分配(通过setter方法)可以按预期工作: groovy:000> c.foo = 'bar' ===> bar groovy:000> c.foo ===> bar 有没有办法让地图构造函数接受瞬态字段? 或者更确切地说:有没有比链接的问题中显示的方法更好的方法来将Map保留为单个JSON编码的DB字段? 这是完整的示例: import grails.converters.JSON class JsonMap { Map data String dataAsJSON static transients = ['data'] def afterLoad() { data = JSON.parse(dataAsJSON) } def beforeValidate() {
  • 如何修复休眠状态“对象引用了未保存的瞬态实例-在刷新之前保存瞬态实例”错误(How to fix the Hibernate “object references an unsaved transient instance - save the transient instance before flushing” error)
    问题 使用Hibernate保存对象时收到以下错误 object references an unsaved transient instance - save the transient instance before flushing 回答1 您应该在集合映射中包括cascade="all" (如果使用xml)或cascade=CascadeType.ALL (如果使用注释)。 发生这种情况是因为您的实体中有一个集合,并且该集合具有一个或多个数据库中不存在的项。 通过指定以上选项,您可以告诉hibernate在保存其父项时将它们保存到数据库中。 回答2 我相信这可能只是重复的答案,但为了澄清@OneToMany ,我在@OneToOne映射以及@OneToMany上获得了此@OneToMany 。 在这两种情况下,都是我尚未添加到Parent中的Child对象尚未保存在数据库中的事实。 因此,当我将Child添加到Parent ,然后保存Parent ,Hibernate将在保存Parent抛出"object references an unsaved transient instance - save the transient instance before flushing"消息。 添加在cascade = {CascadeType.ALL}对Parent
  • iOS - 如何刷新/更新核心数据瞬态属性?(iOS - How to refresh/update Core Data transient property?)
    问题 我正在使用核心数据 NSFetchedResultsController UITableView,它带有一个瞬态 NSDate 属性。 我将此作为临时属性的主要原因是我的 UITableView 条目基于 NSDate 放入部分中,但可以在日期更改时在部分之间移动。 到目前为止它似乎工作得很好,但它只更新/刷新(我真的很陌生,所以我不知道我是否使用了正确的术语,对不起!)当我关闭应用程序并杀死它时从多任务处理,或通过 Xcode 重新运行它。 如果我不这样做,项目不会改变,也不会放入正确的部分。 有没有办法手动让它刷新,这样用户就不需要这样做来让它正常运行? 谢谢! 回答1 当您向对象发送refreshObject:mergeChanges:时,会刷新瞬态属性。 Mundi 提供的应用键值观察机制的解决方案也可能有效,如果有效,肯定比显式刷新方便得多。 回答2 首先,确保在创建获取的结果控制器时,瞬态属性仅用于sectionNameKeyPath 。 最好将其命名为sectionIdentifier (就像 Apple 在其示例代码中所做的那样。)实际日期应该是实体的一个单独属性。 (我将其dateAttribute 。 其次,确保在 Entity.m 文件中指定关键路径依赖项: + (NSSet *
  • JPA瞬态注释和JSON(JPA Transient Annotation and JSON)
    问题 这是有关JPA Transient批注的以下问题的后续解答为什么JPA具有@Transient批注? 我有一个我不想保留的瞬态变量,并用瞬态注释进行了标记。 但是,当我想从我的rest控制器生成JSON时,此瞬态变量在输出的JSON中不可用。 POJO PublicationVO直截了当,没有花哨的属性,只有一些具有getter和setter以及1个瞬态变量的私有属性(被保留)。 @RequestMapping(value = { "{publicationId}"}, method = RequestMethod.GET, produces = "application/json") @ResponseBody public PublicationVO getPublicationDetailsJSON(@PathVariable(value = "publicationId") Integer publicationId) { LOG.info("Entered getPublicationDetailsJSON - publicationId: " + publicationId); //Call method to get the publicationVO based on publicationId PublicationVO publicationVO =
  • 为什么温莎城堡会抓住瞬态物体?(Why does Castle Windsor hold onto transient objects?)
    问题 最近,我注意到我的应用程序似乎正在消耗永不释放的内存。 在使用CLRProfiler进行分析后,我发现我正在使用的Castle Windsor容器保留了对象。 这些对象在config xml中使用Lifestyle =“ transient”属性声明。 我发现如果我显式调用IWindsorContainer.Release(hangingObject) ,它将删除其引用。 但是,这引起了一个问题,我没想到使用临时生活方式对象CastleWindsor会保留引用并有效地造成泄漏。 在所有适当的位置插入显式Release调用将是一个相当平凡且容易出错的任务。 您是否看到过这个问题,并且对如何解决这个问题有任何建议吗? 回答1 我认为这里的答案缺少一个关键点-这种行为可以通过发布策略直接配置-在此处查看城堡项目站点上的文档。 在许多情况下,特别是在托管应用程序的生命周期中存在容器且确实不需要跟踪临时组件的情况下(因为您正在处理注入到服务中的调用代码或组件中的处置),那么您会发现只需将发布策略设置为NoTrackingReleasePolicy实现即可完成。 在Castle v 1.0之前,我相信Component Burden将被实现/引入-这将有助于减轻其中的一些问题以及注入依赖的处置等问题。 编辑: 请查看以下帖子,以详细讨论组件负担。 分量负担-戴维·布里恩斯(Davy
  • 使用NSFetchedresultController对“瞬态”字段进行排序(Sorting on 'transient' fields with NSFetchedresultController)
    问题 有没有办法使用“瞬态”字段或类似的东西,并以某种方式使用NSFetchedResultsController进行相应排序。 我要执行以下操作: 我在数据库中有位置的位置。 当一个人打开列表时,我想在顶部显示最近的位置,然后根据距离进行排序。 但是很明显,这取决于用户的位置,因此我不能使用静态字段。 我希望使用一个过渡字段,因为您可以将其用于节标题。 有没有人可以为这种情况提供解决方案或解决方法? 回答1 您不能在SQlite基本Core Data存储的访存请求中使用瞬态属性。 请参阅“核心数据编程指南”中的“获取托管对象”: 您不能使用基于瞬态属性的谓词来获取(尽管您可以使用瞬态属性自己在内存中进行过滤)。 ...总之,尽管如此,如果直接执行获取,通常不应该在获取请求中添加基于Objective-C的谓词或对描述符进行排序。 相反,您应该将这些应用于提取结果。 您可以将临时属性用于sectionNameKeyPath ,但即使这样,您也需要基于持久属性的节的第一个排序描述符。 因此,唯一的解决方法可能是获取所有对象,然后对获取的数组进行排序。 但是,当然,您再也没有获取结果控制器的优点了。
  • 为什么Java有瞬态字段?(Why does Java have transient fields?)
    问题 为什么Java有瞬态字段? 回答1 该transient中的Java关键字用来指示字段不应该是系列化的一部分(这意味着保存,像一个文件)的过程。 摘自Java SE 7版的Java语言规范的第8.3.1.3。节。 瞬态场: 可以将变量标记为transient以指示它们不是对象持久状态的一部分。 例如,您可能具有从其他字段派生的字段,并且仅应以编程方式进行操作,而不是通过序列化来保持状态。 这是一个GalleryImage类,其中包含图像和从图像派生的缩略图: class GalleryImage implements Serializable { private Image image; private transient Image thumbnailImage; private void generateThumbnail() { // Generate thumbnail. } private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException { inputStream.defaultReadObject(); generateThumbnail(); } } 在此示例中,
  • JPA多对一关系-仅需保存ID(JPA many-to-one relation - need to save only Id)
    问题 我有2个班级:驾驶员和汽车。 汽车表在单独的过程中更新。 我需要的是在Driver中具有属性,该属性使我可以阅读完整的汽车说明,并仅写入指向现有Car的ID。 这是示例: @Entity(name = "DRIVER") public class Driver { ... ID and other properties for Driver goes here ..... @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name = "CAR_ID") private Car car; @JsonView({Views.Full.class}) public Car getCar() { return car; } @JsonView({Views.Short.class}) public long getCarId() { return car.getId(); } public void setCarId(long carId) { this.car = new Car (carId); } } Car对象只是典型的JPA对象,没有向驱动程序的反向引用。 所以我想要达到的目的是: 我可以使用详细的JSON View阅读完整的汽车描述或者我只能在短JsonView中读取汽车的ID 最重要的是,在创建新的Driver时
  • 如何获取@HandleBeforeSave事件中的旧实体值以确定属性是否更改?(How to get old entity value in @HandleBeforeSave event to determine if a property is changed or not?)
    问题 我正在尝试在@HandleBeforeSave事件中获取旧实体。 @Component @RepositoryEventHandler(Customer.class) public class CustomerEventHandler { private CustomerRepository customerRepository; @Autowired public CustomerEventHandler(CustomerRepository customerRepository) { this.customerRepository = customerRepository; } @HandleBeforeSave public void handleBeforeSave(Customer customer) { System.out.println("handleBeforeSave :: customer.id = " + customer.getId()); System.out.println("handleBeforeSave :: new customer.name = " + customer.getName()); Customer old = customerRepository.findOne(customer.getId()); System.out
  • EmberJS 中的非持久属性(Non-persistent attributes in EmberJS)
    问题 有谁知道为 Ember model指定一个不持久化的属性的方法吗? 基本上,我们正在加载一些与每个模型相关的元数据,并通过模型中的RESTAdapter将该数据发送到 Ember。 此元数据可以在我们的应用程序中更改,但通过使用 AJAX 调用来完成。 一旦调用成功,我希望能够通过将模型更改为uncommitted的模型并在幕后对transactions执行任何操作,从而在模型中更新此值,而无需 Ember 将其鼻子放在此业务中。 我也有这个问题,这个元数据不是来自model的数据库记录的数据,它被RESTAdapter传递回服务器,它不期望这些值。 我使用的是 RoR 后端,因此服务器在尝试批量分配根本不是属性的受保护属性时出错。 我知道我可以清理服务器上接收到的数据,但我希望客户端能够区分持久数据和辅助数据。 那么,对于最初的问题:是否有任何替代 Ember-Data 的DS.attr('...')来指定非持久属性? 回答1 当这个 PR 被合并时,可以将属性标记为readOnly 。 但在那之前有一些解决方法,例如覆盖适配器中的addAttributes方法并处理您的特殊属性,这里是一个示例: 通过添加新选项readOnly定义您的模型: App.MyModel = DS.Model.extend({ myMetaProperty: DS.attr(
  • NSFetchedResultsController的瞬时属性上的NSSortDescriptor(NSSortDescriptor on transient attribute for NSFetchedResultsController)
    问题 好吧,我最初想使NSSortDescriptor的请求NSFetchedResultsController来排序根据我的财产NSManagedObject子类,但它显然不会这么做,因为NSFetchedResultsController仅限于谓词和排序描述符的获取实体和它的工作关系,所以我决定在我的数据模型中创建一个过渡属性,将该属性的属性综合到我的NSManagedObject子类中的ivar中,然后基于该属性进行排序。 运行它时,我在执行获取'NSInvalidArgumentException', reason: 'keypath isActive not found in entity <NSSQLEntity SMSourceEntity id=2>'得到了'NSInvalidArgumentException', reason: 'keypath isActive not found in entity <NSSQLEntity SMSourceEntity id=2>' 我知道这是KVO问题,因此我添加了+ (NSSet*)keyPathsForValuesAffectingIsActive ,但仍然存在相同的问题。 我做错了什么,还是我仍然缺少一些东西来使它找到我的密钥路径? 谢谢。 代码: @implementation SMSourceEntity
  • FactoryBot 工厂中的“transient do”块的目的是什么?(What is the purpose of a `transient do` block in FactoryBot factories?)
    问题 在 FactoryBot 工厂中, transient do的目的是transient do ? 我见过很多工厂以下面的方式开始。 factory :car do owner nil other_attribute nil end ... 我在这个博客上找到了一些信息:http://blog.thefrontiergroup.com.au/2014/12/using-factorygirl-easily-create-complex-data-sets-rails/ 但我仍然不完全理解如何以及为什么要这样做。 我对 FactoryBot 的经验很少。 任何有使用 FactoryBot 经验的人都可以分享一些见解吗? 回答1 transient属性允许您传入不是模型属性的数据。 假设您有一个名为car的模型,它具有以下属性: 名称购买价格模型 在工厂中创建汽车模型时,您希望将汽车的名称大写。 我们能做的是: factory :car do transient do # capitalize is not an attribute of the car capitalize false end name { "Jacky" } purchase_price { 1000 } model { "Honda" } after(:create) do |car, evaluator|
  • 什么是对象序列化?(What is object serialization?)
    问题 “对象序列化”是什么意思? 你能用一些例子解释一下吗? 回答1 序列化是将对象转换为一系列字节,以便可以将对象轻松保存到持久性存储中或通过通信链接进行流传输。 然后可以将字节流反序列化-转换为原始对象的副本。 回答2 您可以将序列化视为将对象实例转换为字节序列(取决于实现的二进制或非二进制)的过程。 当您要通过网络传输一个对象数据(例如从一个JVM传输到另一个JVM)时,此功能非常有用。 在Java中,平台内置了序列化机制,但是您需要实现Serializable接口才能使对象可序列化。 您也可以通过将属性标记为transient来防止对象中的某些数据被序列化。 最后,您可以覆盖默认机制,并提供自己的机制。 在某些特殊情况下,这可能是合适的。 为此,您可以使用Java中的隐藏功能之一。 重要的是要注意,序列化的是对象的“值”或内容,而不是类定义。 因此,方法未序列化。 这是一个非常基本的示例,带有注释以方便阅读: import java.io.*; import java.util.*; // This class implements "Serializable" to let the system know // it's ok to do it. You as programmer are aware of that. public class
  • 最终瞬态字段和序列化(final transient fields and serialization)
    问题 在Java中进行序列化后,是否有可能将final transient字段设置为任何非默认值? 我的用例是一个缓存变量-这就是为什么它是transient 。 我也有一个习惯,那就是将不会更改的Map字段定为final (即,地图的内容已更改,但对象本身保持不变)。 但是,这些属性似乎是矛盾的-尽管编译器允许这样的组合,但在非序列化之后,我只能将字段设置为null 。 我尝试了以下操作,但没有成功: 简单的字段初始化(如示例所示):这是我通常所做的,但是在未序列化之后似乎没有发生初始化; 构造函数中的初始化(我相信这在语义上与上面相同); 由于字段为final因此无法在readObject()分配字段。 在这个例子中cache是public仅用于测试。 import java.io.*; import java.util.*; public class test { public static void main (String[] args) throws Exception { X x = new X (); System.out.println (x + " " + x.cache); ByteArrayOutputStream buffer = new ByteArrayOutputStream (); new ObjectOutputStream (buffer)
  • 温莎-从容器中拉出瞬态物体(Windsor - pulling Transient objects from the container)
    问题 如何从容器中拉出本质上是瞬态的对象? 我是否必须在容器中注册它们并将其注入到需要类的构造函数中? 将一切都注入到构造函数中感觉并不好。 同样,对于一个类,我也不想创建TypedFactory并将工厂注入到需要的类中。 我想到的另一个想法是在需要的基础上对它们进行“新”配置。 但是我也将Logger组件(通过属性)注入到我的所有类中。 因此,如果我将它们更新,则必须在这些类中手动实例化Logger 。 如何继续将容器用于所有班级? Logger注入:我的大多数类都定义了Logger属性,除非存在继承链(在这种情况下,只有基类具有此属性,而所有派生类都使用该属性)。 当通过Windsor容器实例化它们时,它们会将我的ILogger实现注入到它们中。 //Install QueueMonitor as Singleton Container.Register(Component.For<QueueMonitor>().LifestyleSingleton()); //Install DataProcessor as Trnsient Container.Register(Component.For<DataProcessor>().LifestyleTransient()); Container.Register(Component.For<Data>()