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

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

CREATE TABLE Cities(cityName TEXT);

任何帮助将不胜感激。

【问题讨论】:

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

标签: ios objective-c core-data


【解决方案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 创建字符串。但我认为可能有更简单的方法来实现这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多