ios - 设置数据库中索引值的数组

标签 ios sqlite uibutton indexing nsmutablearray

我在数据库中有 id 值和 product_image 值。图像与 id 值相关联。我将 productimg_array 图像值设置为按钮以供单击。所以,在这里我需要为这个按钮设置 id 值。所以,我是 uisng for loop。如果我使用 int i=0 图像显示,但如果我设置 int i= cat_iamgeId 图像不显示。为什么?如何将id值作为索引赋值

-(void)actionSheetClickedButtonAtIndex:(int)buttonIndex {


    if (buttonIndex >=0 && buttonIndex < [categoryIds count]) {

        NSInteger categoryId = [categoryIds[buttonIndex] intValue];


      NSLog(@"button is %d",buttonIndex);

        NSLog(@"categoryId is %ld", (long)categoryId);

        productimg_array = [[NSMutableArray array]init];

        descript_array = [[NSMutableArray alloc]init] ;

        cat_imageidArray = [[NSMutableArray alloc]init];


        const char *sql = "SELECT id,cat_id,product_image,order_by,description FROM product where cat_id = ?";

        NSLog(@"sql is %s",sql);

        sqlite3_stmt *statement;

        if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
            // We "step" through the results - once for each row.




            if (sqlite3_bind_int(statement, 1, categoryId) != SQLITE_OK)
                NSLog(@"%s: bind failed: %s", __FUNCTION__, sqlite3_errmsg(database));


            while (sqlite3_step(statement) == SQLITE_ROW) {





                cat_iamgeId = sqlite3_column_int(statement, 0);


                NSLog(@"cat_iamgeId is %ld",(long)cat_iamgeId);

                [cat_imageidArray addObject:@(cat_iamgeId)];




                product_image = [[NSString alloc] initWithUTF8String:
                                 (const char *) sqlite3_column_text(statement, 2)];
               // NSLog(@"product_image is %@",product_image);

                [productimg_array addObject:product_image];






                descript = [[NSString alloc] initWithUTF8String:
                            (const char *) sqlite3_column_text(statement, 4)];

             //   NSLog(@"descript is %@",descript);


                [descript_array addObject:descript];



           }


        }

用于 UIButton 点击​​的循环:

    for (int i = 0; i<[productimg_array count]; i++ ) {






       NSLog(@"productimg_array_index %@", cat_imageidArray[i]);





            imgView1=[[UIButton alloc]initWithFrame:CGRectMake(20+(i*74), 0, 72, 72)];

            Width = Width + 20+(i*74);




              imgView1.tag = i;

              NSLog(@"product id is %ld ", (long)imgView1.tag);


            [imgView1 addTarget:self action:@selector(dbsofaClicked:) forControlEvents:UIControlEventTouchUpInside];


            [imgView1 setImageWithURL:[NSURL URLWithString:[productimg_array objectAtIndex:i]]
                             forState:UIControlStateNormal];



            [scrollview addSubview:imgView1];






        }

NSlog 标签值:

product id is 202 
 product id is 203 
 product id is 204 
 product id is 205 
 clicked
 button 202 is clicked.
 *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 202 beyond bounds [0 .. 3]'

imgView1 点击:(dbsofaclicked:)

-(void)dbsofaClicked:(id)sender{


   NSLog(@"clicked");


    NSLog(@"button %d is clicked.", [sender tag]);

          mmageView=[[UIImageView alloc]initWithFrame:CGRectMake(50,50,150,150)];


    [mmageView setUserInteractionEnabled:YES];


    [mmageView setImageWithURL:[NSURL URLWithString:[productimg_array objectAtIndex:[sender tag]]] placeholderImage:nil options:SDWebImageProgressiveDownload completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {



    }];

    [mmageView setTag:[sender tag]];

    [self.view addSubview:mmageView];
}

最佳答案

有一种更好的方法可以做到这一点。使用一个数组来保存每个产品图像的数据。

NSMutableArray *image_array = [NSMutableArray array];

while (sqlite3_step(statement) == SQLITE_ROW) {
    cat_imageId = sqlite3_column_int(statement, 0);
    product_image = [[NSString alloc] initWithUTF8String:
                     (const char *) sqlite3_column_text(statement, 2)];
    [image_array addObject:@{ "id" : @(cat_imageId), @"url" : product_image }];
    NSLog(@"cat_imageId is %ld",(long)cat_imageId);
    NSLog(@"product_image is %@",product_image);
}

这会创建一个字典数组。这将每个图像的数据保存在一起。这允许您根据需要对数据进行排序,并且您只需处理一个数组。

然后您创建按钮的代码变为(根据您的更新):

for (NSUInteger i = 0; i < image_array.count; i++) {
    NSDictionary *image_data = image_array[i];

    UIButton *imgView1 = [[UIButton alloc] initWithFrame:CGRectMake(20+(i*74), 0, 72, 72)];
    Width = Width + 20 + (i * 74);

    imgView1.tag = i;
    [imgView1 addTarget:self action:@selector(dbsofaClicked:) forControlEvents:UIControlEventTouchUpInside];
    [imgView1 setImageWithURL:[NSURL URLWithString:image_data[@"url"]] forState:UIControlStateNormal];

    [scrollview addSubview:imgView1];
}

关于ios - 设置数据库中索引值的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20534639/

相关文章:

ios - 快速读取Firebase实时数据库中的数据

ios - viewController 内的 tableview 中没有显示任何信息

ios - 如何修复 - safeAreaLayoutGuide' 仅适用于 iOS 11.0 或更新版本

sql - EF Core - 删除列解决方法(sqlite)

iphone - 如何更改UIButton点击(触摸)事件的文本标签?

ios - PFQuery - 如何获取 NSError?

sql - 在 SQLite 中根据 Radius 查询获取记录?

java - 如何将带有缩写记录的sqlite数据库添加到android项目中

ios - UIButton颜色在iphone 8 plus和iphone X中有渐变(iOS版本独立问题)

ios - 通过长按代码创建的按钮的弹出窗口