2016-01-11 10 views
0

У меня проблема после выбора из sql. Я отправляю updateRow NSArray из 5 объектов. После обновления (я сделал 5 раз addRow), я получаю только один из них на getGroupsByUserId.Sqlite select return 1 row after insert

Вот мой код:

+(BOOL)createUserTable:(sqlite3*)database{ 
    char* errormsg; 

NSString* sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (%@ TEXT PRIMARY KEY, %@ TEXT)",USER_GROUPS_TABLE,USER_ID,GROUP_ID]; 
int res = sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errormsg); 
if(res != SQLITE_OK){ 
    NSLog(@"ERROR: failed creating USERS-GROUPS table"); 
    return NO; 
} 
return YES; 
} 

+(void)updateRow:(sqlite3*)database rowToUpdate:(NSArray*)rowToUpdate{ 
    for (UserGroup* ug in rowToUpdate) { 
     [UsersGroupsRelationShipSql addRow:database userId:ug.userId groupId:ug.groupId ]; 
     NSLog(@"update Row %@ %@", ug.userId, ug.groupId); 
    } 
} 

+(void)addRow:(sqlite3*)database userId:(NSString*)userId groupId:(NSString*)groupId{ 
    NSLog(@"addRow: '%@', '%@'", userId, groupId); 
    sqlite3_stmt *statment; 
    NSString* query = [NSString stringWithFormat:@"INSERT OR REPLACE INTO %@ (%@,%@) values (?,?);",USER_GROUPS_TABLE,USER_ID,GROUP_ID]; 

    if (sqlite3_prepare_v2(database,[query UTF8String],-1,&statment,nil) == SQLITE_OK){ 
     sqlite3_bind_text(statment, 1, [userId UTF8String],-1,NULL); 
     sqlite3_bind_text(statment, 2, [groupId UTF8String],-1,NULL); 
     if(sqlite3_step(statment) == SQLITE_DONE){ 
      sqlite3_finalize(statment); 
      return; 
     } 
    } 
    sqlite3_finalize(statment); 
    NSLog(@"ERROR: addRowToTable failed %s",sqlite3_errmsg(database)); 
} 



+(NSMutableArray*)getGroupsByUserId:(sqlite3*)database userId:(NSString*)userId{ 
    NSLog(@"getGroupsByUserId: '%@'", userId); 
    NSMutableArray* data = [[NSMutableArray alloc] init]; 
    sqlite3_stmt *statment; 
    NSString* query = [NSString stringWithFormat:@"SELECT * from USERS_GROUPS WHERE %@ = %@;", USER_ID,userId]; 

    if (sqlite3_prepare_v2(database,[query UTF8String],-1,&statment,nil) == SQLITE_OK){ 
     while(sqlite3_step(statment) == SQLITE_ROW){ 
      NSString* usId = [NSString stringWithFormat:@"%s",sqlite3_column_text(statment,0)]; 
      NSString* grId = [NSString stringWithFormat:@"%s",sqlite3_column_text(statment,1)]; 
      NSLog(@" row: '%@', '%@'", usId, grId); 
      UserGroup* ug = [[UserGroup alloc] init:usId groupId:grId]; 
      [data addObject:ug]; 
     } 
    } 
    else{ 
     NSLog(@"ERROR: getGroupsByUserId failed %s",sqlite3_errmsg(database)); 
     sqlite3_finalize(statment); 
     return nil; 
    } 
    sqlite3_finalize(statment); 
    return data; 
} 

Debug Результат:

2016-01-13 11:30:11.901 MaverickApp[7196:142637] userId Logged = 1 
2016-01-13 11:30:11.919 MaverickApp[7196:142637] Groups tab was loaded 
2016-01-13 11:30:11.920 MaverickApp[7196:142675] getGroupsByUserId: userId = 1 from Sql 
2016-01-13 11:30:11.922 MaverickApp[7196:142675] get row: userId = 1, groupId = 2 from Sql 
2016-01-13 11:30:11.927 MaverickApp[7196:142675] Returned groupsByUser from parse from date 2016-01-13 09:24:11 +0000 
2016-01-13 11:30:11.931 MaverickApp[7196:142637] Groups tab was loaded 
2016-01-13 11:30:11.932 MaverickApp[7196:142684] getGroupsByUserId: userId = 1 from Sql 
2016-01-13 11:30:11.935 MaverickApp[7196:142684] get row: userId = 1, groupId = 2 from Sql 
2016-01-13 11:30:11.937 MaverickApp[7196:142684] Returned groupsByUser from parse from date 2016-01-13 09:24:11 +0000 
2016-01-13 11:30:12.121 MaverickApp[7196:142675] Returned row: groupId 1 userId 6 
2016-01-13 11:30:12.121 MaverickApp[7196:142675] Returned 1 groups for userId = 1 from parse 
2016-01-13 11:30:12.122 MaverickApp[7196:142675] data 1 
2016-01-13 11:30:12.122 MaverickApp[7196:142675] update Row: userId = 1 groupId = 6 in Sql 
2016-01-13 11:30:12.123 MaverickApp[7196:142675] add Row: userId = 1 groupId = 6 in Sql 
2016-01-13 11:30:12.127 MaverickApp[7196:142675] addRow done 
2016-01-13 11:30:12.128 MaverickApp[7196:142675] getGroupsByUserId: userId = 1 from Sql 
2016-01-13 11:30:12.129 MaverickApp[7196:142675] get row: userId = 1, groupId = 6 from Sql 
2016-01-13 11:30:12.129 MaverickApp[7196:142675] Group id number 6 for userId 1 
2016-01-13 11:30:12.142 MaverickApp[7196:142675] getGroup: groupId = 6 from Sql 
2016-01-13 11:30:12.143 MaverickApp[7196:142675] getGroup: groupId = 6 from Sql 
2016-01-13 11:30:12.145 MaverickApp[7196:142675] Returned groups from parse from date 2016-01-13 09:24:14 +0000 
2016-01-13 11:30:12.504 MaverickApp[7196:142684] Returned row: groupId 1 userId 6 
2016-01-13 11:30:12.505 MaverickApp[7196:142684] Returned 1 groups for userId = 1 from parse 
2016-01-13 11:30:12.505 MaverickApp[7196:142684] data 1 
2016-01-13 11:30:12.506 MaverickApp[7196:142684] update Row: userId = 1 groupId = 6 in Sql 
2016-01-13 11:30:12.506 MaverickApp[7196:142684] add Row: userId = 1 groupId = 6 in Sql 
2016-01-13 11:30:12.509 MaverickApp[7196:142684] addRow done 
2016-01-13 11:30:12.511 MaverickApp[7196:142684] getGroupsByUserId: userId = 1 from Sql 
2016-01-13 11:30:12.511 MaverickApp[7196:142684] get row: userId = 1, groupId = 6 from Sql 
2016-01-13 11:30:12.512 MaverickApp[7196:142684] Group id number 6 for userId 1 
2016-01-13 11:30:12.512 MaverickApp[7196:142684] getGroup: groupId = 6 from Sql 
2016-01-13 11:30:12.512 MaverickApp[7196:142684] getGroup: groupId = 6 from Sql 
2016-01-13 11:30:12.513 MaverickApp[7196:142684] Returned groups from parse from date 2016-01-13 09:24:14 +0000 
2016-01-13 11:30:12.824 MaverickApp[7196:142675] Returned 3 groups from parse 
2016-01-13 11:30:12.825 MaverickApp[7196:142675] addGroup: groupId = 2 in Sql 
2016-01-13 11:30:12.828 MaverickApp[7196:142675] addGroup done 
2016-01-13 11:30:12.828 MaverickApp[7196:142675] addGroup: groupId = 6 in Sql 
2016-01-13 11:30:12.830 MaverickApp[7196:142675] addGroup done 
2016-01-13 11:30:12.830 MaverickApp[7196:142675] addGroup: groupId = 8 in Sql 
2016-01-13 11:30:12.832 MaverickApp[7196:142675] addGroup done 
2016-01-13 11:30:12.833 MaverickApp[7196:142675] getGroup: groupId = 6 from Sql 
2016-01-13 11:30:12.834 MaverickApp[7196:142675] getGroup: groupId = 6 from Sql 
2016-01-13 11:30:13.138 MaverickApp[7196:142684] Returned 3 groups from parse 
2016-01-13 11:30:13.138 MaverickApp[7196:142684] addGroup: groupId = 2 in Sql 
2016-01-13 11:30:13.142 MaverickApp[7196:142684] addGroup done 
2016-01-13 11:30:13.142 MaverickApp[7196:142684] addGroup: groupId = 6 in Sql 
2016-01-13 11:30:13.144 MaverickApp[7196:142684] addGroup done 
2016-01-13 11:30:13.144 MaverickApp[7196:142684] addGroup: groupId = 8 in Sql 
2016-01-13 11:30:13.145 MaverickApp[7196:142684] addGroup done 
2016-01-13 11:30:13.146 MaverickApp[7196:142684] getGroup: groupId = 6 from Sql 
2016-01-13 11:30:13.147 MaverickApp[7196:142684] getGroup: groupId = 6 from Sql 
+0

BTW, я бы предложил использовать 'SQLITE_TRANSIENT' для ваших вызовов' sqlite3_bind_text'. – Rob

+0

Я также предлагаю проверить успех или значение 'sqlite3_step', например' int rc; while ((rc = sqlite3_step (statment)) == SQLITE_ROW) {...}; if (rc! = SQLITE_DONE) {...} ' – Rob

+0

Если у вас все еще есть проблемы, вы можете отредактировать код для введённых значений (a); (б) значения, полученные методом getGroupsByUserId. А затем вставьте то, что появилось в журнале, когда вы запустили код, вставив пять значений идентификатора пользователя/группы и выбрав их обратно. – Rob

ответ

0

Там несколько проблем:

  1. Вы используете INSERT OR REPLACE. Если основным ключом вашей таблицы является только поле userid, вы увидите поведение, которое вы описываете. Дважды проверьте первичный ключ для этой таблицы.

  2. Убедитесь, что база данных находится не в комплекте, а находится в каком-то обновляемом месте, например в папке «Документы» или тому подобное.

  3. В вашем оригинале getGroupsByUserId, я не вижу, как это будет работать вообще, потому что вы не использовали заполнитель ? и не использовали кавычки вокруг строкового литерала. Я бы подумал, что это вызвало бы ошибку.

    я предлагаю делать с помощью ? заполнителя для userId, а затем использовать sqlite3_bind_text для этого значения в предложении WHERE. Но теперь вы изменили код в своем ответе (не сообщая нам, изменилось ли поведение или нет).

+0

, если я меняю место % @ =? и использовать sqlite3_bind_text. Где я добавляю эту строку и что я делаю, чтобы получить каждый параметр столбца? Посмотрите мое редактирование –

+0

Как я могу отлаживать файл sql, чтобы снова иметь 5 объектов (я могу видеть их при отладке в любом случае) –

+0

Re '?' Placeholder, yep, который выглядит хорошо (хотя, опять же, я бы использовал 'SQLITE_TRANSIENT'). Re отладки, см. Мой комментарий выше. – Rob