2016-10-12 1 views
0

Ich bin neu in iOS-Entwicklung. Ich versuche eine einfache Todo-Liste App zu machen. Ich benutze Xocde 8 und Ziel-C-Sprache. Ich habe mehrere Tutorials ausprobiert, konnte aber die Datenbanktabelle nicht erstellen. Hier ist mein Code.kann keine Datenbanktabelle erstellen und in iOS einfügen sqlite3

-(void)createOrOpenDB{ 
    printf("createOrOpenDB: into this function \n"); 

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

    dbPathString = [[NSString alloc] initWithString: [dirPaths stringByAppendingPathComponent:@"person.db"]]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    char *err; 
    printf("createOrOpenDB: into this function before if statement \n"); 
    if(![fileManager fileExistsAtPath:dbPathString]){ 
     const char *dbPath = [dbPathString UTF8String]; 
      printf("createOrOpenDB: into this functions 1st if statement \n"); 
     //create db here 
     if(sqlite3_open(dbPath, &personDB) ==SQLITE_OK){ 
      const char *sql_stnt = "CREATE TABLE IF NOT EXISTS PERSONS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER)"; 
      if(sqlite3_exec(personDB, sql_stnt, NULL, NULL, &err) !=SQLITE_OK){ 
       printf("Failed to create table\n"); 
      } 
      sqlite3_close(personDB); 
      printf("createOrOpenDB: database table created\n"); 
     } 
    } 
} 

, wenn ich die Add-Taste drücken, das gibt mir keine Fehler. aber es fügt keine Daten hinzu. NSLog in xcode 8 nicht funktioniert. also habe ich stattdessen printf gemacht. und mein Code bricht vor der if-Anweisung. kann mir jemand sagen, was ich falsch mache?

+0

Dies erstellt Tabelle, wenn die Datenbank nicht existiert. Aber was ist, wenn die Datenbank existiert, aber die Tabelle nicht existiert (z. B. hatten Sie vielleicht eine frühere Version, die diese 'create table' Logik nicht hatte)? Ich würde in den Dokumentenordner schauen und sehen, ob dort eine Datenbank ist oder nicht. Wenn ja, würde ich es löschen und es erneut versuchen. – Rob

+0

das ist richtig. Mein Tisch wurde bereits erstellt. Aber das Problem ist, wenn ich die Schaltfläche "Hinzufügen" drücke, fügt es nichts in die Datenbank ein. –

Antwort

0

wie dies tun,

+(DBManager*)getSharedInstance{ 
    if (!sharedInstance) { 
     sharedInstance = [[super allocWithZone:NULL]init]; 
     [sharedInstance createDB]; 
    } 
    return sharedInstance; 
} 

-(BOOL)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: @"student.db"]]; 
    BOOL isSuccess = YES; 
    NSFileManager *filemgr = [NSFileManager defaultManager]; 
    if ([filemgr fileExistsAtPath: databasePath ] == YES) 
    { 
     const char *dbpath = [databasePath UTF8String]; 
     if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
     { 
      char *errMsg; 
      const char *sql_stmt = "create table if not exists studentsDetail (regno integer primary key, name text, department text, year text)"; 
      if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) 
       != SQLITE_OK) 
      { 
       isSuccess = NO; 
       NSLog(@"Failed to create table"); 
      } 
      else 
      { 
       NSLog(@"Table Created Successfully"); 
      } 
      sqlite3_close(database); 
      return isSuccess; 
     } 
     else { 
      isSuccess = NO; 
      NSLog(@"Failed to open/create database"); 
     } 
     sqlite3_finalize(statement); 
    } 
    return isSuccess; 
    // NSLog(@"database %@", isSuccess); 
} 

Für in dieser Tabelle die Daten zu speichern,

- (BOOL) saveData:(NSString*)registerNumber name:(NSString*)name 
     department:(NSString*)department year:(NSString*)year; 
{ 
    const char *dbpath = [databasePath UTF8String]; 
    if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
    { 
     NSString *insertSQL = [NSString stringWithFormat:@"insert into studentsDetail (regno,name, department, year) values (\"%ld\",\"%@\", \"%@\", \"%@\")",(long)[registerNumber integerValue], name, department, year]; 
           const char *insert_stmt = [insertSQL UTF8String]; 
           sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL); 
           if (sqlite3_step(statement) == SQLITE_DONE) 
           { 
            return YES; 
           } 
           else { 
            return NO; 
           } 
           sqlite3_reset(statement); 
           } 
           return NO; 
           } 

Es wird jedes Mal erstellen Tabelle, wenn Tabelle nicht existiert.

Hoffnung t hilft dir.

+0

Ich denke, das ist rückwärts. Der Zweck dieser Routine besteht darin, die Datenbank und die Tabelle zu erstellen, wenn sie nicht existiert. Wenn dort keine Datenbank vorhanden ist, wird dies nicht erzeugt ... – Rob

+0

Auch 'sqlite3_finalize' gehört nicht hierher. Sie tun das nur, wenn Sie eine Aussage vorbereitet haben, die Sie nicht hier haben ... – Rob

+0

danke für die Antwort. aber meine Datenbanktabelle ist bereits erstellt. aber wenn ich die Schaltfläche "Hinzufügen" drücke, wird die Info in der Datenbanktabelle nicht hinzugefügt. –

Verwandte Themen