2014-04-26 192 views
-2

我有一个应用程序使用核心数据。如何以编程方式获得实体的描述,即SQL创建代码,如:以编程方式获取核心数据实体说明

CREATE TABLE Cities(cityName TEXT); 

任何帮助,将不胜感激。

+1

你能描述一下你想达到什么样的? 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结构是:

  • 不明显
  • 无证
  • 不受支持
  • 私人
  • 如有更改

使用您自己的风险

+1

在这种特殊情况下可能并不重要,但一般来说,构建查询的方法很容易出现SQL注入。更好地使用准备好的声明。我认为FMDB支持'[database executeQuery:@“SELECT sql FROM sqlite_master WHERE name =?,tableName]'或类似。 –

+0

谢谢你的明确答案。 –

+0

@Martin:你是对的SQL注入。对于那个很抱歉。 –

1

你可以试试这个:

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

希望这有助于。

+0

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