2015-04-23 27 views
3

我从CoreData转换为Realm.io我做了一个小实验,看看Realm.io如何处理需要具有RLMObject类的子类的情况。如何在Realm.io中实现抽象实体

型号

import Realm 

@objc enum RecurrenceEnum : Int { 
    case Daily = 1 
    case Weekly = 2 
    case Monthly = 3 
} 

class Challenge: RLMObject { 
    dynamic var title = "" 
} 

class TotalCountChallenge: Challenge { 
    dynamic var totalCountGoal: Int = 0 
} 

class RecurringChallenge: Challenge { 
    dynamic var recurranceType: RecurrenceEnum = .Daily 
    dynamic var totalCountGoal: Int = 0 
} 

当我保存无论是TotalCountChallenge或不再报错,但是当我去按标题来查询挑战我没有得到任何回报一个RecurringChallenge。

从我的ViewController

查询

// Query using an NSPredicate object 
let predicate = NSPredicate(format: "title BEGINSWITH %@", "Booya") 
var challenges = Challenge.objectsWithPredicate(predicate) 

if challenges == nil || challenges.count == 0 { 
    let tcChallenge = TotalCountChallenge() 
    tcChallenge.title = "Booya Total Count Challenge" 
    tcChallenge.totalCountGoal = 1_000_000 

    let rChallenge = RecurringChallenge() 
    rChallenge.title = "Booya Recurring Challenge" 
    rChallenge.recurranceType = .Weekly 
    rChallenge.totalCountGoal = 2_000_000 

    let realm = RLMRealm.defaultRealm() 
    // You only need to do this once (per thread) 

    // Add to the Realm inside a transaction 
    realm.beginWriteTransaction() 
    realm.addObject(tcChallenge) 
    realm.addObject(rChallenge) 
    realm.commitWriteTransaction() 
} 

challenges = Challenge.objectsWithPredicate(predicate) 
if challenges != nil && challenges.count > 0 { 
    for challenge in challenges { 
     let c = challenge as! Challenge 
     println("\(c.title)") 
    } 
} else { 
    println("No Challenges found") 
} 

challenges = TotalCountChallenge.objectsWithPredicate(predicate) 
if challenges != nil && challenges.count > 0 { 
    for challenge in challenges { 
     let c = challenge as! Challenge 
     println("TotalCountChallenge: \(c.title)") 
    } 
} else { 
    println("No Total Count Challenges found") 
} 

challenges = RecurringChallenge.objectsWithPredicate(predicate) 
if challenges != nil && challenges.count > 0 { 
    for challenge in challenges { 
     let c = challenge as! Challenge 
     println("RecurringChallenge \(c.title)") 
    } 
} else { 
    println("No Recurring Challenges found") 
} 

输出

No Challenges found 
TotalCountChallenge: Booya Total Count Challenge 
RecurringChallenge Booya Recurring Challenge 

当我看使用浏览工具的领域我看到提供的数据库,世界上只有1个TotalCountChallenge和1 RecurringChallenge和有没有挑战

enter image description here

有没有办法做到这一点?

这里是在GitHub上的代码的链接:lewissk/RealmTest

回答

6

领域支持的子类,但不是那种多态的,你要寻找的。在Realm中,每个对象类型都存储在自己的表中,而不管您是否已将其作为另一个对象的子类在代码中声明。这意味着目前不可能跨不同的对象类进行查询,即使它们共享一个通用的超类。在https://github.com/realm/realm-cocoa/issues/1109处有一个跟踪此功能请求的问题。