2013-04-06 56 views
1

我正在嘗試爲SqLite數據庫執行簡單的硬編碼插入語句。代碼工作,我從我自己的NSLog得到一個成功的消息,但是,沒有記錄被添加到數據庫。誰能幫忙?謝謝! VivSqlite插入語句不會在iOS應用程序中添加記錄

-(void)addFavorites{ 
    const char *sqlInsert = "insert into rivers (stat_ID, stat_Name, state) values ('03186500','WILLIAMS RIVER','WA')"; 
    sqlite3_stmt *statement; 

    sqlite3_prepare_v2(_database, sqlInsert, -1, &statement, NULL); 
    if(sqlite3_step(statement) == SQLITE_DONE){ 
     NSLog(@"RECORD ADDED!"); 
    } else { 
     NSLog(@"RECORD NOT ADDED!"); 
    } 
    sqlite3_finalize(statement); 
} 
+1

您是否已將數據庫複製出包? – MishieMoo 2013-04-06 01:44:25

+1

此症狀的常見原因是用戶正在嘗試操作捆綁包中數據庫的副本。該包是隻讀的,並且必須從那裏複製數據庫以讀取/寫入要修改的空間。 – 2013-04-06 02:11:48

+0

您*必須*檢查'sqlite3_prepare_v2'的返回值。 – 2013-04-06 09:01:11

回答

0

在應用程序委託中是否有像這樣的代碼將數據庫從數據庫複製到NSDocuments目錄?一定要將數據庫複製到那裏,然後在運行sqlite3_open時指向那裏,而不是指向bundle。當設備同步到iTunes或iCloud時,NSDocument目錄將被保存,所以這是您希望數據庫用於維護數據的地方。

NSString *databaseName = @"MyDatabase.sqlite"; 
NSArray *systemPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *libraryDirectory = [systemPaths objectAtIndex:0]; 
NSString *databaseFullPath = [libraryDirectory stringByAppendingFormat:@"%@%@",@"/",databaseName]; 

//copy the database to the file system if it hasn't been done yet. 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
BOOL exists = [fileManager fileExistsAtPath:databaseFullPath]; 
if(exists == NO) 
{ 
    NSString *dbPathInBundle = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 
    [fileManager copyItemAtPath:dbPathInBundle toPath:databaseFullPath error:nil]; 
}