#objective-c
#objective-c
Вопрос:
Инструкция SQLite insert не вставляет новые данные
я использую этот код
- (void) addN: (number *) theN
{
const char *sql = "insert into table (valueN) Values(?)";
sqlite3_stmt *addStmt = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString * docsDir = [paths objectAtIndex:0];
NSString * thePath = [docsDir stringByAppendingPathComponent: @"theDB.sqlite"];
sqlite3_open([thePath UTF8String], amp;database);
sqlite3_prepare_v2(database, sql, -1, amp;addStmt, NULL);
sqlite3_bind_int(addStmt, 1, theN.theNumber);
sqlite3_step(addStmt);
sqlite3_finalize(addStmt);
sqlite3_close(database);
}
и метод для вставки записи
- (IBAction) saveN: (id) sender
{
numbers *theNumbers = [[numbers alloc] init];
number *theNumber = [[number alloc] init];
theNumber.theNumber = newN;
[theNumbers addN:theNumber];
[theNumbers release];
[theNumber release];
}
код выполняется, но в базу данных не вставляется запись.
может кто-нибудь, пожалуйста, указать мне, где ошибка — потому что там, очевидно, ошибка 🙂
Комментарии:
1. У меня нет ответа на ваш вопрос, но когда я вижу все усилия, которые приходится затрачивать на простую вставку строки в базу данных — я понимаю, почему я использую core data!
2. Ваша первая проблема заключается в том, что вы не проверяете какие-либо коды возврата. У вас могут быть ошибки справа и слева, и вы не знаете об этом.
Ответ №1:
Вы не проверяете возвращаемые значения ни одного из вызовов sqlite3. Есть большая вероятность, что один из них выходит из строя.
Ответ №2:
этот код, похоже, работает:
- (void) addN: (number *) theN
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *thePath = [[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"theDB.sqlite"];
BOOL success = [fileManager fileExistsAtPath:thePath];
if (!success)
{
NSLog(@"Failed to find database file '%@'.", thePath);
}
if (!(sqlite3_open([thePath UTF8String], amp;database) == SQLITE_OK))
{
NSLog(@"An error opening database, normally handle error here.");
}
const char *sql = "insert into table (valueN) Values(?)";
sqlite3_stmt *addStmt = nil;
if (sqlite3_prepare_v2(database, sql, -1, amp;addStmt, NULL) != SQLITE_OK)
{
NSLog(@"Error, failed to prepare statement, normally handle error here.");
}
sqlite3_bind_int(addStmt, 1, theN.theNumber);
sqlite3_step(addStmt);
if(sqlite3_finalize(addStmt) != SQLITE_OK)
{
NSLog(@"Failed to finalize data statement, normally error handling here.");
}
if (sqlite3_close(database) != SQLITE_OK)
{
NSLog(@"Failed to close database, normally error handling here.");
}
}