как добавить NSDictionary в строку таблицы в базе данных sqlite

Я новичок в разработке iphone. Я хочу сохранить один NSDictionary в строке таблицы sqlite. Я гуглил и нашел много результатов, но это не работает для меня.

это мой словарь:

NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:@"24",@"id",@"Folder",@"name",@"300 MB",@"size", nil];

также я искал на этом сайте, но ничего не понимаю в подобных сообщениях. пожалуйста, объясните мне больше о добавлении (хранении) NSDictionary в строке таблицы SQLite DB.


person estefan    schedule 01.05.2013    source источник
comment
Вам нужно будет закодировать словарь (возможно, как JSON или plist) и сохранить его в базе данных.   -  person dreamlax    schedule 01.05.2013
comment
мой дьявол, я могу закодировать этот словарь в plist, но как сохранить его (plist) в базе данных???   -  person estefan    schedule 01.05.2013


Ответы (3)


вы можете сделать это, создав таблицу с тремя столбцами (используя запрос на создание таблицы). А затем вставьте эти объекты из вашего словаря в эти столбцы (используя запрос на вставку).

Изменить: для вставки данных используйте запрос:

            NSString *query = [NSString stringWithFormat:@"insert into tablename (column1, column2,column3) values('%@','%@','%@')",[dic objectForKey:@"id"],[dic objectForKey:@"name"],[dic objectForKey:@"size"]];
            NSLog(@"query : %@",query);
            [self executeQuery:query];

В классе .h создайте экземпляр sqlite:

sqlite3 *database; and import:  #import<sqlite3.h>

В классе .m добавьте эти методы:

-(NSString *) dataFilePath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSLog(@"PATH %@",[documentsDirectory stringByAppendingPathComponent:DatabaseName]);
    return [documentsDirectory stringByAppendingPathComponent:DatabaseName];
}

/*==================================================================
              METHOD FOR INSERTING DATA IN DATABASE
 ==================================================================*/
-(void)executeQuery:(NSString *)query
{
    //NSLog(@"QUERY : %@",query);

    sqlite3_stmt *statement;
    if(sqlite3_open([[self dataFilePath] UTF8String], &database) == SQLITE_OK)
    {
        if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL) == SQLITE_OK)
        {
            if (sqlite3_step(statement) != SQLITE_DONE)
            {
                sqlite3_finalize(statement);
            }
        }
        else
        {
            NSLog(@"query Statement Not Compiled");
        }

        sqlite3_finalize(statement);
        sqlite3_close(database);
    }
    else
    {
        NSLog(@"Data not Opened");
    }
}

Для чтения данных:

/*==================================================================
 METHOD FOR Fetching Data FROM DATABASE
 ==================================================================*/
 NSString *query = [NSString stringWithFormat:@"select * from table_name"];
NSMutableArray *tableData = [self fetchingDataFromTable:query];

// Здесь массив табличных данных содержит все записи

-(NSMutableArray *)fetchingDataFromTable:(NSString *)query;
{
    NSLog(@"QUERY : %@",query);

    NSString *idToReturn=@"";
    NSMutableArray *returnArray = [NSMutableArray new];
    if(sqlite3_open([[self dataFilePath] UTF8String], &database) == SQLITE_OK)
    {
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil)==SQLITE_OK)
        {
            while(sqlite3_step(statement)==SQLITE_ROW)
            {
                NSMutableDictionary *temp= [NSMutableDictionary new];
                const char *s;


                s=(char *)sqlite3_column_text(statement, 0);
                if(s==NULL)
                {
                    idToReturn=@"";
                }
                else
                {
                    idToReturn =[NSString stringWithUTF8String:s];
                }
                [temp setObject:idToReturn forKey:@"id"];

                s=(char *)sqlite3_column_text(statement, 1);
                if(s==NULL)
                {
                    idToReturn=@"";
                }
                else
                {
                    idToReturn =[NSString stringWithUTF8String:s];
                }
                [temp setObject:idToReturn forKey:@"name"];

                s=(char *)sqlite3_column_text(statement, 2);
                if(s==NULL)
                {
                    idToReturn=@"";
                }
                else
                {
                    idToReturn =[NSString stringWithUTF8String:s];
                }
                [temp setObject:idToReturn forKey:@"size"];

                if (temp != nil)
                {
                    [returnArray addObject:temp];

                    temp = nil;
                }

            }
            sqlite3_finalize(statement);
            sqlite3_close(database);
        }
    }
    return returnArray;

}

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

person Nishant Tyagi    schedule 01.05.2013
comment
Спасибо, дорогой друг. Я создаю таблицу БД с тремя столбцами с именами (идентификатор, имя, размер) и что я делаю на этом уровне??? можете ли вы объяснить мне больше о (использовании запроса на вставку) с кодом !!! большое спасибо. - person estefan; 01.05.2013
comment
мой друг, я даю этот запрос об ошибке. Заявление не скомпилировано, почему? - person estefan; 01.05.2013
comment
сделай это.спасибо мой друг у меня есть один вопрос!!! таким образом можно добавить много NSDictionary в таблицу sqlite??? - person estefan; 01.05.2013
comment
и как читать эти данные из sqlite?? Большое спасибо, если ответите на два вопроса, мастер... :-* - person estefan; 01.05.2013
comment
Да, вы можете добавить столько, сколько вам нужно. Вы можете использовать цикл, а затем использовать запрос на вставку для повторной вставки. - person Nishant Tyagi; 01.05.2013
comment
мой друг, я добавляю этот код в свое приложение. как понять чтение из sqlite??? хранить в NSmutableArray *returnArray??? - person estefan; 01.05.2013
comment
Вот это да!!! Дорогой друг, я так запутался !!! что я делаю, когда сохраняю (при первом запуске приложения) этот NSDictionary в таблице sqlite и после серии проверок данных, если они существуют в sqlite, не добавляйте... - person estefan; 01.05.2013
comment
@NishantTyagi Я получаю этот запрос об ошибке. Заявление не скомпилировано, почему? Не могли бы вы подсказать, что я делаю неправильно? Я создаю таблицу БД с тремя столбцами с именами (id, name, size). - person Dilip Mishra; 02.06.2021
comment
@NishantTyagi Алос, когда я получаю пустые данные, я использую тот же код. - person Dilip Mishra; 03.06.2021

Я создал динамический код, который вернет список всех столбцов со всеми строками.

 -(NSMutableDictionary*)getRowsFromTableName:(NSString*)tableName
 {
 NSString *databasePath =[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
//                         stringByAppendingPathComponent: @"sqlcipher.db"];
 sqlite3 *db;
 bool sqlcipher_valid = NO;
 NSMutableDictionary *dbData = [[NSMutableDictionary alloc]init];
 NSMutableArray *columnList = [[NSMutableArray alloc]init];

 if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
    const char* key = [keyString UTF8String];
    sqlite3_key(db, key, strlen(key));
    if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
        if(sqlite3_prepare_v2(db, "PRAGMA cipher_version;", -1, &stmt, NULL) == SQLITE_OK) {
            if(sqlite3_step(stmt)== SQLITE_ROW) {
                const unsigned char *ver = sqlite3_column_text(stmt, 0);
                if(ver != NULL) {
                    sqlcipher_valid = YES;

                    // password is correct (or database initialize), and verified to be using sqlcipher
                    char *errMsg;
                    const char *query = [[NSString stringWithFormat:@"select * from %@",tableName] UTF8String]; //where name = 'abc'";
                    if (sqlite3_exec(db, query, NULL, NULL, &errMsg)
                        != SQLITE_OK)
                    {
                        // isSuccess = NO;
                        NSLog(@"Failed to open data into table");
                        [dbData setValue:@"Failed to open data into table" forKey:@"Message"];
                        [dbData setValue:@"Failed" forKey:@"status"];
                        return dbData;
                    }
                    else
                    {
                        NSLog(@"Data open Successfully");
                        int num_cols;
                        if(sqlite3_prepare_v2(db, query, -1, &stmt, NULL) == SQLITE_OK) {

                            while (sqlite3_step(stmt) == SQLITE_ROW)
                            {
                                num_cols = sqlite3_data_count(stmt);
                                NSMutableDictionary *columnDic = [[NSMutableDictionary alloc]init];
                                for (int i = 1; i < num_cols; i++) {
                                    NSString *colValue = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, i)];
                                    NSString *colName = [NSString stringWithUTF8String:(char*)sqlite3_column_name(stmt, i)];
                                    [columnDic setValue:colValue forKey:colName];
                                    NSLog(@"%@",columnDic);
                                }
                                [columnList addObject:columnDic];
                                columnDic = nil;
                            }
                            NSLog(@"%@",columnList);
                            [dbData setValue:columnList forKey:@"data"];

                        }
                    }
                }
            }
            else
            {
                NSLog(@"Error while binding variable. '%s'", sqlite3_errmsg(db));
                [dbData setValue:[NSString stringWithFormat:@"Error while binding variable. '%s'", sqlite3_errmsg(db)] forKey:@"Message"];
                [dbData setValue:@"Failed" forKey:@"status"];
                return dbData;
            }
            sqlite3_finalize(stmt);
        }
        else
        {
            NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(db));
            [dbData setValue:[NSString stringWithFormat:@"Error while creating update statement. '%s'", sqlite3_errmsg(db)] forKey:@"Message"];
            [dbData setValue:@"Failed" forKey:@"status"];
            return dbData;
        }
    }
    else
    {
        NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(db));
        [dbData setValue:[NSString stringWithFormat:@"Error while creating update statement. '%s'", sqlite3_errmsg(db)] forKey:@"Message"];
        [dbData setValue:@"Failed" forKey:@"status"];
        return dbData;
    }
    sqlite3_close(db);
}
NSLog(@"%@",dbData);

return dbData;

}

person Chaaruu Jadhav    schedule 15.07.2017

И получить данные в словарь из таблицы в iOS:

-(void)getData:(NSString *) tablename
{
    NSMutableDictionary * tabledata= [[NSMutableDictionary alloc] init];
    NSString *str = @"select * from ";
    NSString *strQuery = [str stringByAppendingString:tablename];
    tabledata = [db executeQuery:strQuery];

    NSDictionary *dic = [tabledata valueForKey:@"0"];
    NSLog(@"dic is:%@",dic);
}
person jevin ambaliya    schedule 20.04.2016