2014-04-26 187 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創建字符串的方法。但我認爲可能有更簡單的方法來實現這一點。 –