如何在核心数据中执行复杂的获取请求
How to do a complex fetch request in Core data
我已经在我的应用程序中实现了用于存储的核心数据。我需要使用 FetchRequest 和谓词执行复杂的提取,如下 SQLite 查询:
SELECT
diagnosis_drug.drug_id,
diagnosis_drug.weight_bracket_id,
score,
localscore,
(score + localscore) AS score,
drug.*
FROM diagnosis_drug
INNER JOIN drug
ON diagnosis_drug.drug_id = drug.id
WHERE diagnosis_drug.doctor_id = 3
AND diagnosis_id IN (29, 212)
AND score > 0
AND weight_bracket_id = 1
AND diagnosis_drug._d = 0
ORDER BY score DESC
这里diagnosis_drug&drug是实体,其他是属性。
Entity : Diagnosis_drug
Attributes :
diagnosisId - Int32
doctorId - Int32
drugId - Int32
score - Int32
localScore - Int32
Entity : Drug.
Attributes :
id : Int32
dosage : Int32
volume : Int32
genericName : String
formulation : String
doseType : String
duration : Int32
name : String
药物的 "id" 属性等于 Diagnosis_drug 的 "drugId" 属性。查询是从 Diagnosis_drug 中获取得分最高的药物,并对药物实体进行内部连接以获取其详细信息。
所以,我发现核心数据几乎没有限制。只有当它们之间存在关系时,您才能对两个不同的实体执行 fetchrequest。即。如果你在 Person(entity_1) 和他的 mobile(entity_2) 之间有 one-to-one 关系,要获取两者,我们需要对 Person 实体执行获取。要在 Person 上设置过滤器,我们将根据需要添加 Predicate 并在 mobile 上设置过滤器,我们将在同一谓词中的 mobile 属性上放置一个 "SUBQUERY" 。如果这两个实体没有关系,则可以解决。您将这两个实体作为新 Parent 实体的 sub-entity,并对新 Parent 实体执行提取 (See Reference!)。这仍然给我们留下了这两个实体已经有一些其他 Parents 的情况!这里没有关系,也没有共同的 Parent 实体。所以这里是Core data的局限性。您需要分别对这两个实体执行提取。此外,核心数据提取不允许在查询谓词内进行计算(您需要在实体中维护一个额外的变量,并根据需要每次更新它)。欢迎对我的发现进行任何更正。谢谢
我已经在我的应用程序中实现了用于存储的核心数据。我需要使用 FetchRequest 和谓词执行复杂的提取,如下 SQLite 查询:
SELECT
diagnosis_drug.drug_id,
diagnosis_drug.weight_bracket_id,
score,
localscore,
(score + localscore) AS score,
drug.*
FROM diagnosis_drug
INNER JOIN drug
ON diagnosis_drug.drug_id = drug.id
WHERE diagnosis_drug.doctor_id = 3
AND diagnosis_id IN (29, 212)
AND score > 0
AND weight_bracket_id = 1
AND diagnosis_drug._d = 0
ORDER BY score DESC
这里diagnosis_drug&drug是实体,其他是属性。
Entity : Diagnosis_drug
Attributes :
diagnosisId - Int32
doctorId - Int32
drugId - Int32
score - Int32
localScore - Int32
Entity : Drug.
Attributes :
id : Int32
dosage : Int32
volume : Int32
genericName : String
formulation : String
doseType : String
duration : Int32
name : String
药物的 "id" 属性等于 Diagnosis_drug 的 "drugId" 属性。查询是从 Diagnosis_drug 中获取得分最高的药物,并对药物实体进行内部连接以获取其详细信息。
所以,我发现核心数据几乎没有限制。只有当它们之间存在关系时,您才能对两个不同的实体执行 fetchrequest。即。如果你在 Person(entity_1) 和他的 mobile(entity_2) 之间有 one-to-one 关系,要获取两者,我们需要对 Person 实体执行获取。要在 Person 上设置过滤器,我们将根据需要添加 Predicate 并在 mobile 上设置过滤器,我们将在同一谓词中的 mobile 属性上放置一个 "SUBQUERY" 。如果这两个实体没有关系,则可以解决。您将这两个实体作为新 Parent 实体的 sub-entity,并对新 Parent 实体执行提取 (See Reference!)。这仍然给我们留下了这两个实体已经有一些其他 Parents 的情况!这里没有关系,也没有共同的 Parent 实体。所以这里是Core data的局限性。您需要分别对这两个实体执行提取。此外,核心数据提取不允许在查询谓词内进行计算(您需要在实体中维护一个额外的变量,并根据需要每次更新它)。欢迎对我的发现进行任何更正。谢谢