以编程方式获取 Core Data 实体描述

Posted

技术标签:

【中文标题】以编程方式获取 Core Data 实体描述【英文标题】:Programmatically get Core Data entity description 【发布时间】:2014-04-26 07:43:05 【问题描述】:

我有一个使用 Core Data 的应用。如何以编程方式获取实体的描述,即 SQL 创建代码,例如:

CREATE TABLE Cities(cityName TEXT);

任何帮助将不胜感激。

【问题讨论】:

您能描述一下您想要实现的目标吗? SQLite 代码是一个实现细节,对 Core Data API 是隐藏的。 “实体描述”和“SQLite 表”之间也不需要 1-1 对应,例如在多对多关系的情况下。 - 如果(无论出于何种原因)您需要 SQLite 表结构,那么您必须使用 sqlite API 直接访问它。 【参考方案1】:

我不确定你为什么要这样做,实际上,你可能不想这样做,但你可以用类似的方式来做(使用 FMDB https://github.com/ccgus/fmdb):

NSString *dbPath = @"/path/to/my/CoreData/repository.sqlite"; // use NSBundle for actual code
NSString *entityName = @"Cities";
NSString *tableName = [NSString stringWithFormat:@"Z%@", [entityName uppercaseString]];
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
if (database.open) 
    NSString *query =  [NSString stringWithFormat:@"SELECT sql FROM sqlite_master WHERE name = '%@';", tableName];
    FMResultSet *results = [database executeQuery:query];
    while([results next]) 
        NSString *sql = [results stringForColumnIndex:0];
        return sql;
    

当然,这假设您的 CoreData 应用程序使用 SQLite 存储库(通常情况下)。

这是我为我的一个名为FormInstance 的实体得到的:

CREATE TABLE ZFORMINSTANCE ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZDEF INTEGER, ZCREATED TIMESTAMP, ZSENT TIMESTAMP, ZIDENTIFIER VARCHAR, ZLABEL VARCHAR, ZUSER VARCHAR )

该实体具有这些属性:

created
identifier
label
sent
user

还有这些关系:

def
roles
values

CoreData 结构的映射是:

不明显 无证 不支持 私人 可能会发生变化

使用风险自负

【讨论】:

在这种特殊情况下可能并不重要,但通常您构建查询的方法容易受到 SQL 注入的影响。最好使用准备好的语句。我认为 FMDB 支持 [database executeQuery:@"SELECT sql FROM sqlite_master WHERE name = ?", tableName] 或类似的方式。 @Martin:你是正确的 SQL 注入。对此感到抱歉。【参考方案2】:

你可以试试这个:

NSEntityDescription *desc = [NSEntityDescription entityForName:@"Cities" inManagedObjectContext:context];

希望这会有所帮助。

【讨论】:

是的,目前我正在研究这种方法来构建 sql 创建字符串。但我认为可能有更简单的方法来实现这一点。

以上是关于以编程方式获取 Core Data 实体描述的主要内容,如果未能解决你的问题,请参考以下文章

在运行时动态创建 Core Data 实体

Core Data 获取仅具有唯一属性的实体

在 Core Data 中获取具有关系的实体

有人想以编程方式创建 Core Data 模型有啥理由吗?

以编程方式将属性添加到 Core Data

如果Core Data count / fetch请求中的实体名称错误,如何避免崩溃?