2012-06-02 4 views
1

У меня есть приложение для iPad, использующее базу данных sqlite с использованием FMDB в качестве обертки. Я могу успешно запрашивать данные из базы данных; однако, когда я пытаюсь вставить данные с помощью executeUpdate, метод срабатывает правильно (т. е. я не получаю никаких ошибок и возвращает YES), но в базу данных ничего не вставлено. Я пытаюсь немедленно восстановить объект, который я только что вставил, и он равен нулю. Я также пытаюсь посмотреть количество строк в таблице, в которую я вставил, и таблица пуста. Любая идея, что я делаю неправильно? Вот некоторые из кода:База данных Sqlite с оберткой FMDB, не вставляющая данные

--init метод класса, который обрабатывает всю дб работу

-(NSString *)getDbPath {  
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     return [documentsDirectory stringByAppendingPathComponent:@"iRecipeBox.db"]; 
    } 

    -(id)init { 
     self = [super init]; 
     if(self) { 
      database = [FMDatabase databaseWithPath:[self getDbPath]]; 
      [database open]; 
     } 

     return self; 
    } 

--App код делегат, который перемещает мой дб в каталог DOCS

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     // Override point for customization after application launch. 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 
     NSError *error; 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 

     NSString *docsPath = [documentsDirectory stringByAppendingPathComponent:@"iRecipeBox.db"]; 

     if ([fileManager fileExistsAtPath:docsPath] == NO) { 
      NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"iRecipeBox" ofType:@"db"]; 
      [fileManager copyItemAtPath:resourcePath toPath:docsPath error:&error]; 
     } 
     return YES; 

}

--Code для вставки данных в одной из таблиц

recipeID = [NSNumber numberWithInt:newRecipeID]; 
    [database beginTransaction]; 
    NSArray *newRow = [[NSArray alloc] initWithObjects:recipeID,title, description, picFile, prepTime, cookTime, ovenTemp, nil]; 
    NSString *sql = @"insert into recipes (id, name, descr, picFile, prepTime, cookTime, ovenTemp) values (?, ?, ?, ?, ?, ?, ?)"; 
    NSLog(@"Before update, the number of args is %i", [newRow count]); 

    if([database executeUpdate:sql withArgumentsInArray:newRow]) { 
     [database commit]; 
     NSLog(@"the insert worked"); 
    } else { 
     [database rollback]; 
     NSLog(@"the insert failed"); 
    } 

ответ

1

[База данных FMDatabaseWithPath:] возвращает объект с автореализацией, поэтому вы захотите сохранить это, если вы не используете ARC.

Проверить [database lastError] сразу после executeUpdate :, и посмотреть, не говорит ли он что-либо.

И, наконец, нет смысла использовать транзакцию, если это всего лишь одна вставка.

Смежные вопросы