2010-09-28 69 views
0

我用下面insert數據的代碼到我sqlite-database但由於某些原因,應用程序始終只要方法被調用崩潰,問題似乎是"sqlite3_open"聲明。有誰知道我可能做錯了什麼?iphone sdk:添加數據到sqlite數據庫不工作?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.title = @"Animals"; 
    animalsArray = [[NSMutableArray alloc] init]; 
    animalDetailController = [[AnimalDetailViewController alloc] init]; 
    addAnimalController = [[AddAnimalViewController alloc] init]; 
    addAnimalController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    UIBarButtonItem *addItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction)]; 
    self.navigationItem.rightBarButtonItem = addItem; 

    databaseName = @"AnimalDatabase.sql"; 

    NSArray *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentsPath objectAtIndex:0]; 
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 
    [self checkAndCreateDatabase]; 

    [self readDataFromDatabase]; 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
} 

- (void)addAction{ 
    [self presentModalViewController:addAnimalController animated:YES];  
} 

- (void)checkAndCreateDatabase{  
    BOOL databaseIsSaved; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    databaseIsSaved = [fileManager fileExistsAtPath:databasePath]; 
    if (databaseIsSaved == YES) { 
     return; 
    } 
    else { 
     NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 
     [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; 
    } 
    [fileManager release]; 
} 

- (void)readDataFromDatabase{ 

    sqlite3 *database; 
    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
      const char *sqlStatement = "select * from animals"; 
      sqlite3_stmt *compiledStatement; 
      if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 

        while (sqlite3_step(compiledStatement) == SQLITE_ROW) { 
          [animalsArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)], @"name", [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)], @"description", nil]]; 
        } 
      } 

      sqlite3_finalize(compiledStatement); 
    } 
    sqlite3_close(database); 
} 

- (void)writeToDatabase{  
    sqlite3 *database; 
    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
      const char *sqlStatement = "insert into animals(name, description) VALUES(?, ?)"; 
      sqlite3_stmt *compiledStatement;     
      if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK){ 
        sqlite3_bind_text(compiledStatement, 1, [addAnimalController.animalName UTF8String], -1, SQLITE_TRANSIENT); 
        sqlite3_bind_text(compiledStatement, 2, [addAnimalController.animalDescription UTF8String], -1, SQLITE_TRANSIENT); 
      } 

      if(sqlite3_step(compiledStatement) != SQLITE_DONE) { 
        NSLog(@"Error: %s", sqlite3_errmsg(database)); 
      } else { 
        NSLog(@"Insert into row id = %d", sqlite3_last_insert_rowid(database)); 
      } 
      sqlite3_finalize(compiledStatement); 
    } 
    sqlite3_close(database); 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    if (addAnimalController.saveButtonPressed == YES && [addAnimalController.animalName length] != 0 && [addAnimalController.animalDescription length] != 0) { 
      [animalsArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:addAnimalController.animalName, @"name", addAnimalController.animalDescription, @"description", nil]]; 
      [self.tableView reloadData]; 

      [self writeToDatabase]; 
      addAnimalController.saveButtonPressed = NO; 
     } 
} 
+0

你看到在調試器中任何錯誤消息?發生崩潰時顯示的錯誤信息是什麼? – 2010-09-28 22:55:18

+0

編程接收信號:「EXC_BAD_ACCESS」。 – 2010-09-28 23:00:27

+0

你確定databasePath不是零或空嗎? – 2010-09-28 23:05:04

回答

1

你需要一個當您設定databasePath保留。

databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 

應該

databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] retain]; 

確保你釋放它在你的viewDidUnloaddealloc實現。 (這可能是聰明的你設置它,以及之前釋放它。)

+0

非常感謝你的工作! – 2010-09-29 11:02:25