2012-09-15 21 views
0

我正在使用FMDatabase來操作sqlite3數據庫。這裏是我的代碼:EXC_BAD_ACCESS插入

NSString *dbFilePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"temp_info.db"]]; 

FMDatabase *fmdb = [FMDatabase databaseWithPath:dbFilePath]; 
if (![fmdb open]) { 
    NSLog(@"......"); 
} else { 
    NSString *sql = @"CREATE TABLE IF NOT EXISTS test1(id INTEGER, name TEXT, create_time TEXT)"; 
    if (![fmdb executeUpdate:sql]) { 
     NSLog(@"......"); 
    } 
    for (int i = 0; i < 3; i++) { 
     BOOL result = [fmdb executeUpdate:@"INSERT INTO test1(id, name, create_time) values(?,?,?)", i+1, @"test", @"12-09-10 12:10"]; 
     NSLog(@"%d", result); 
    } 
    // EXC_BAD_ACCESS 
} 

當我運行線路:

BOOL result = [fmdb executeUpdate:@"INSERT INTO test1(id, name, create_time) values(?,?,?)", i+1, @"test", @"12-09-10 12:10"]; 

我得到一個EXC_BAD_ACCESS錯誤。爲什麼?

+0

如果你已經解決了這個問題,你仍然需要接受你自己的答案。這將標記關閉的問題。 – Artemix

回答

9

問題已解決!
* 1. *提供給-executeUpdate:方法(或任何接受va_list作爲參數變體),所有參數都必須objects.The以下將無法正常工作(並會導致崩潰):
[db executeUpdate:@"INSERT INTO mytable VALUES (?)", 66];
插入了一些正確的方法是框它在NSNumber對象:
[db executeUpdate:@"INSERT INTO mytable VALUES (?)", [NSNumber numberWithInt:66]];
* 2. *另外,你可以使用-execute*WithFormat:變種使用NSString式的換人:
[db executeUpdateWithFormat:@"INSERT INTO mytable VALUES (%d)", 66];
爲you.The下列百分修飾內部,-execute*WithFormat:方法正確拳的事情被認可:
%@%c%s%d%D%i%u%U%hi%hu%qi%qu%f%ld%lu,%lld%llu
使用其他修飾符會產生不可預知的結果。如果出於某種原因需要%字符出現在您的SQL語句中,則應該使用%%