我有一个应用程序使用核心数据。如何以编程方式获得实体的描述,即SQL创建代码,如:以编程方式获取核心数据实体说明
CREATE TABLE Cities(cityName TEXT);
任何帮助,将不胜感激。
我有一个应用程序使用核心数据。如何以编程方式获得实体的描述,即SQL创建代码,如:以编程方式获取核心数据实体说明
CREATE TABLE Cities(cityName TEXT);
任何帮助,将不胜感激。
我不知道你为什么要这么做,实际上,你可能不希望这样做,但你可以用类似的东西(使用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注入。对于那个很抱歉。 –
你可以试试这个:
NSEntityDescription *desc = [NSEntityDescription entityForName:@"Cities" inManagedObjectContext:context];
希望这有助于。
是的,目前我正在研究这种构建sql创建字符串的方法。但我认为可能有更简单的方法来实现这一点。 –
你能描述一下你想达到什么样的? SQLite代码是一个实现细节,并且隐藏在Core Data API中。此外,在“实体描述”和“SQLite表”之间不需要有1-1个记者,例如在多对多关系的情况下。 - 如果(无论出于何种原因)你需要SQLite表结构,那么你必须直接用sqlite API访问它。 –