我將腳本作爲iOS項目的一部分執行。我這樣做的原因是創建數據庫模式的同一系列腳本也會更新數據庫模式(在發佈之後,運行新的增量腳本以將模式拉向前方)。它在這裏詳細解釋:
SQLITE with Android (best methodology for setting up a database)
我添加腳本作爲項目的資源,然後執行它。有一些EXxxx日誌記錄調用,但通用。注意tail-sqlite的使用在腳本循環時執行一個語句,尾部作爲它停留的標記。這裏是我用來執行的功能:
- (BOOL)executeScript:(NSString *)contents error:(NSError **)error
{
ENHeading(@"executeScript");
sqlite3_stmt *stmt = NULL;
const char *zTail;
int rc;
zTail = [contents UTF8String];
while(zTail != NULL && 0 < strlen(zTail))
{
ENDebug("zTail: \"%s\"\n", zTail);
NSString *tailStr = [NSString stringWithUTF8String:zTail];
NSString *trimmed = [tailStr stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([trimmed length] == 0)
{
ENInfo("ignoring trailing whitespace");
break;
}
// Temporarily hold this until the end of the loop in case we need to report an error
const char *newzTail;
rc = sqlite3_prepare_v2(_sqlite3, zTail, -1, &stmt, &newzTail);
if(SQLITE_OK != rc)
{
ENError(@"prepare err:%@", [self errorMessage]);
if (error != NULL) {
*error = [[[ENSqliteError alloc] initWithErrorCode:ENSqliteErrorInvalidSql
reason:[self errorMessage]] autorelease];
}
return NO;
}
rc = sqlite3_step(stmt);
ENDebug(@"rc=%d", rc);
switch (rc)
{
case SQLITE_ROW:
ENError(@"statement returns rows, script ignores");
break;
case SQLITE_OK:
case SQLITE_DONE:
break;
default:
ENError(@"error");
ENError(@"prepare err:%@", [self errorMessage]);
if (error != NULL) {
*error = [[[ENSqliteError alloc] initWithErrorCode:ENSqliteErrorReadingRows
reason:[self errorMessage]] autorelease];
}
return NO;
}
// For next time around the loop
zTail = newzTail;
// Clear up since we're about to prepare another
sqlite3_finalize(stmt);
}
return YES;
}
你是什麼樣的sql文件?像SQL轉儲?或sqlite數據庫? – 2012-07-31 23:42:57
您通常不會在應用程序中使用.sql文件。如果你有SQL文件,例如,創建表並可能填充數據,你可以使用'sqlite3'或其他一些sqlite數據庫實用程序,並在Mac上執行SQL,從而創建一個sqlite數據庫,然後可以使用它你的iOS應用程序。但該應用程序本身不使用.sql文件。請注意,sqlite的SQL與其他數據庫引擎不完全相同,所以如果它是爲另一個數據庫引擎設計的,您可能需要調整.sql文件。 – Rob 2012-07-31 23:45:37
你必須告訴我們你的.sql文件的目的是什麼,然後我們可以更好地建議你如何使用它。 – Rob 2012-07-31 23:47:06