以编程方式获取 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 实体描述的主要内容,如果未能解决你的问题,请参考以下文章