2014-02-24 4 views
0

Я использую SQLite DB в своем приложении iOS. На моем экране 1 я смог успешно создать базу данных, таблицу, вставить в нее и извлечь из нее.Добавить таблицу в существующую базу данных IOS sqlite

Однако с экрана 2, когда я пытаюсь создать таблицу в той же базе данных и вставить значения, я не могу.

Это код, который я использую.

-(void) createDB{ 
    NSString *docsDir; 
    NSArray *dirPaths; 

    // Get the documents directory 
    dirPaths = NSSearchPathForDirectoriesInDomains(
                NSDocumentDirectory, NSUserDomainMask, YES); 

    docsDir = dirPaths[0]; 

    // Build the path to the database file 
    _databasePath = [[NSString alloc] 
        initWithString: [docsDir stringByAppendingPathComponent: 
             @"coning.db"]]; 

    NSFileManager *filemgr = [NSFileManager defaultManager]; 

    if ([filemgr fileExistsAtPath: _databasePath ] == NO) 
    { 
     const char *dbpath = [_databasePath UTF8String]; 

     if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) 
     { 
      char *errMsg; 
      const char *sql_stmt = 
      "CREATE TABLE IF NOT EXISTS order (ID INTEGER PRIMARY KEY AUTOINCREMENT , NAME TEXT UNIQUE , ADDRESS TEXT UNIQUE, PHONE TEXT UNIQUE)"; 

      if (sqlite3_exec(_contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) 
      { 
       NSLog(@"Failed to create table"); 
      } 
      sqlite3_close(_contactDB); 
     } else { 
      NSLog(@"Failed to open/create database"); 
     } 
    } 



} 
- (void)saveData { 
    sqlite3_stmt *statement; 
    const char *dbpath = [_databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) 
    { 

     NSString *insertSQL = [NSString stringWithFormat: 
           @"INSERT OR REPLACE INTO order (name, address, phone) VALUES (\"%@\", \"%@\", \"%@\")", 
           @"name", @"address", @"phone"]; 

     const char *insert_stmt = [insertSQL UTF8String]; 
     sqlite3_prepare_v2(_contactDB, insert_stmt, 
          -1, &statement, NULL); 
     if (sqlite3_step(statement) == SQLITE_DONE) 
     { 
      NSLog(@"added"); 
     } else { 
      NSLog(@"Failed to add contact"); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(_contactDB); 
    } 
} 

Я использовал тот же код для добавления записей в таблице 1, но когда я делаю то же самое, чтобы создать таблицу 2, его говорит: "Не удалось добавить контакт. Может ли кто-нибудь предложить, где я могу ошибиться?

Кроме того, я хочу, чтобы сделать PK таблицы 1 как FK в таблице 2.

+0

Проверьте ErrorMsg: http://www.sqlite.org/c3ref/errcode.html – bryanmac

+0

Проверьте ErrorMsg ^^^ И использовать FMDB https://github.com/ccgus/fmdb – Eugene

+0

Что такое сообщение после вызова 'sqlite3_errmsg()' после ошибки? –

ответ

2

Вы можете использовать sqlite3_exec() метод вместо sqlite3_step().

sqlite3_exec() выполнит любой запрос, который вы указали.

Я уверен, это определенно поможет вам.

-(BOOL)createNewTableInExistingDb 
    { 

     NSArray *array=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *filePath=[array objectAtIndex:0]; 

     filePath =[filePath stringByAppendingPathComponent:@"database.db"]; 

     NSFileManager *manager=[NSFileManager defaultManager]; 

     BOOL success = NO; 
     if ([manager fileExistsAtPath:filePath]) 
     { 
     success =YES; 
     } 
     if (!success) 
     { 
      NSString *path2=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database.db"]; 
      success =[manager copyItemAtPath:path2 toPath:filePath error:nil]; 
} 
    createStmt = nil; 
    NSString *[email protected]"SecondTable"; 
    if (sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) { 
    if (createStmt == nil) { 

     NSString *query=[NSString stringWithFormat:@"create table %@(RegNo integer, name text)",tableName]; 

    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &createStmt, NULL) != SQLITE_OK) { 
     return NO; 
    } 
    sqlite3_exec(database, [query UTF8String], NULL, NULL, NULL); 
    return YES; 
} 
} 
return YES; 
} 
+0

Это отлично работает для создания таблицы. Однако код, который я использовал ранее, также создает вторую таблицу, но я не могу вставить ее во вторую таблицу. – user1882758

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