не удается создать таблицу базы данных и вставить в iOS sqlite3

#ios #objective-c #sqlite #xcode8

#iOS #objective-c #sqlite #xcode8

Вопрос:

Я новичок в разработке iOS. Я пытаюсь создать простое приложение для составления списка задач. Я использую xocde 8 и язык objective-C. Я попробовал несколько руководств, но не смог создать таблицу базы данных. Вот мой код.

 -(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, amp;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, amp;err) !=SQLITE_OK){
                printf("Failed to create tablen");
            }
            sqlite3_close(personDB);
            printf("createOrOpenDB: database table createdn");
        }
    }
}
  

когда я нажимаю кнопку добавления, она не выдает мне никакой ошибки. но он не добавляет никаких данных. NSLog не работает в xcode 8. поэтому вместо этого я сделал printf . и мой код прерывается перед операцией if . кто-нибудь может сказать мне, что я делаю не так?

Комментарии:

1. Это создает таблицу, если база данных не существует. Но что, если база данных существует, но таблицы там нет (например, возможно, у вас было более раннее исполнение, в котором не было этой create table логики)? Я бы заглянул в папку documents и посмотрел, есть ли там база данных или нет. Если есть, я бы удалил его и попробовал еще раз.

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

Ответ №1:

сделайте так,

  (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, amp;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, amp;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);
}
  

Для сохранения данных в этой таблице,

 - (BOOL) saveData:(NSString*)registerNumber name:(NSString*)name
       department:(NSString*)department year:(NSString*)year;
{
    const char *dbpath = [databasePath UTF8String];
    if (sqlite3_open(dbpath, amp;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, amp;statement, NULL);
                                if (sqlite3_step(statement) == SQLITE_DONE)
                                {
                                    return YES;
                                }
                                else {
                                    return NO;
                                }
                                sqlite3_reset(statement);
                                }
                                return NO;
                                }
  

Он будет создавать таблицу каждый раз, когда таблица не существует.

Надеюсь, t вам поможет.

Комментарии:

1. Я думаю, что это наоборот. Цель этой процедуры — создать базу данных и таблицу, если она не существует. Если там нет базы данных, это не создаст ее…

2. Кроме того, sqlite3_finalize здесь не место. Вы делаете это только в том случае, если подготовили инструкцию, которой у вас здесь нет…

3. спасибо за ответ. но моя таблица базы данных уже создана. но когда я нажимаю кнопку добавить, она не добавляет информацию в таблицу базы данных.

4. не могли бы вы рассказать, как я могу добавить данные в эту таблицу?

5. @Droppy bro проверьте этот код и мой. Я реализовал этот код из одного руководства в своем проекте, поэтому его код не копируется. Выполните поиск в Интернете, и вы найдете этот код в одном из учебников, доступных в Интернете. Этот код в моем проекте. И цель состоит в том, чтобы решить проблему