0

私はしばらくこの問題に悩まされていますが、それを正しくする方法が思いつかないようです。できる限りわかりやすく説明しようと思います。

私のコア データ モデルには 3 つのエンティティがあります。職場患者引継ぎ

ここに画像の説明を入力

Workplaceは複数のPatientを持つことができます。また、患者は複数のWorkplaceに属することができます。

患者は 1 つのハンドオーバーを持つことができ、その逆も同様です。

アプリでは、Workplaces のリストがユーザーに表示されます。ユーザーが Workplace を選択すると、その選択された Workplace に属し、今日の引き継ぎがある一連の患者を取得する必要があります。患者は複数の引き継ぎを行うことができるため、患者のレコードが重複する可能性がありますが、問題ありません。

これが私が今していることです。まず、選択したユーザーの Workplace オブジェクトを取得します。次に、Patients を反復処理し、Patient オブジェクトの ID を抽出して配列に収集します。次に、患者 ID の配列と日付を渡して、指定された日付に引き継ぎがある患者を除外します。

let workplace = db.loadWorkplace(155) // 155 is the ID of the Workplace

var patientIDs: [Int] = []
for p in workplace.patients {
    let patient = p as Patient
    patientIDs.append(patient.id)
}
handovers = db.loadHandovers(patientIDs, date: NSDate.date())

これはフィルタリングを行う方法です。

public func loadHandovers(patients: [Int], date: NSDate) -> [AnyObject] {

    let fetchRequest = NSFetchRequest()
    let entityDescription = NSEntityDescription.entityForName("Handover", inManagedObjectContext: managedObjectContext!)
    let patientPredicate = NSPredicate(format: "patient.id IN %@", patients)
    let datePredicate = NSPredicate(format: "date > %@ AND date < %@", getStartDate(date), getEndDate(date))

    let compoundPredicate = NSCompoundPredicate(type: .AndPredicateType, subpredicates: [patientPredicate, datePredicate])

    fetchRequest.entity = entityDescription
    fetchRequest.predicate = compoundPredicate

    var error: NSError?
    let result = managedObjectContext?.executeFetchRequest(fetchRequest, error: &error)
    return result!
}

およびメソッドはオブジェクトgetStartDate()getEndDate()変換し、NSDateその開始時刻と終了時刻を取得して日付フレームを取得します。私はそれらを他の場所で使用しており、機能しています。これについての詳細な説明があります。

とにかく、私のloadHandovers()メソッドは 0 の結果を返します。データを挿入すると、今日の引き継ぎが表示されるからではありません。以下は、コア データから実行される SQL クエリです。

SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDATE, t0.ZSIGNEDBY, t0.ZSTATUS, t0.ZPATIENT 
FROM ZHANDOVER t0 
JOIN ZPATIENT t1 ON t0.ZPATIENT = t1.Z_PK 
WHERE ( t1.ZID IN  (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 
AND ( t0.ZDATE > ? AND  t0.ZDATE < ?)) 

私の述語に何か問題があるかどうか、誰か教えてもらえますか? または、これに完全にアプローチするさまざまな方法がある場合は? 本当にありがたいです。

ありがとうございました。

4

1 に答える 1

2

オブジェクト グラフを使用すると、これは非常に単純に見えます。冗長なフェッチ リクエストを避けるようにしてください。

workplace.patients.filteredSetUsingPredicate(
  NSPredicate(format: "handovers.date > %@ && handovers.date < %@", 
              startOfDay, endOfDay))

自分のセットアップについて少し混乱しているようです。患者が を 1 つしか持っていない場合、その関係を複数形でHandover呼ぶのはなぜですか?handovers

セットアップの別の欠陥は、矛盾したステートメントによって示されています

「患者は複数の引き継ぎを行うことができるので...」

データ モデルでは、患者の引き継ぎは1 回で、多くはありません。唯一の説明はPatient、患者が複数のハンドオーバーを持っているという理由だけで、同じ患者に対して複数のインスタンスを維持しているということです。それは確かに非論理的であり、混乱と遭遇したエラーの部分的な理由です.

患者の重複を回避する、より優れたデータ構造:

Workplace <<---->> Patient <---->> Handover

これは、引き渡しが病院とは何の関係もないことを前提としています。その場合は、Handover@DanK が提案するように、エンティティを一種の結合テーブルとして使用する必要があります。

Workplace <---->> Handover <<----> Patient

これが必要な場合、述語の適用はさらに短くなります。

workplace.handovers.filteredSetUsingPredicate(
  NSPredicate(format: "date > %@ && date < %@", startOfDay, endOfDay))
于 2014-10-07T22:44:06.043 に答える