我有一個應用程序使用核心數據。如何以編程方式獲得實體的描述,即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訪問它。 –