Iphone 在数组中存储对象

Iphone 在数组中存储对象,iphone,objective-c,database,sqlite,nsmutablearray,Iphone,Objective C,Database,Sqlite,Nsmutablearray,我正在处理一个数据库,并试图将表中的行作为字典存储在数组中 #import "RootViewController.h" #import "ProgettoAppDelegate.h" #import "AddItemViewController.h" #import "DetailViewController.h" #include <sqlite3.h> @implementation RootViewController @synthesize nibLoadedCell;

我正在处理一个数据库,并试图将表中的行作为字典存储在数组中

#import "RootViewController.h"
#import "ProgettoAppDelegate.h"
#import "AddItemViewController.h"
#import "DetailViewController.h"
#include <sqlite3.h>

@implementation RootViewController
@synthesize nibLoadedCell;
@synthesize addItem;

NSNumberFormatter *priceFormatter;
NSDateFormatter *dateFormatter;
NSMutableArray *shoppingListItems; <--i created here...
NSDictionary *editItem;

-(void) loadDataFromDb {
//apriamo il database
sqlite3 *db;
int dbrc; //Codice di ritorno del database (database return code)

ProgettoAppDelegate *appDelegate = (ProgettoAppDelegate *) [UIApplication sharedApplication].delegate;
const char *dbFilePathUTF8 = [appDelegate.dbFilePath UTF8String];
dbrc = sqlite3_open(dbFilePathUTF8, &db);
if (dbrc) {
    NSLog(@"Impossibile aprire il Database!");
    return;
}
//database aperto! Prendiamo i valori dal database.
sqlite3_stmt *dbps; //Istruzione di preparazione del database
NSString *queryStatementNS = @"select key, item, price, groupid, dateadded from shoppinglist order by item";
const char *queryStatement = [queryStatementNS UTF8String];
dbrc = sqlite3_prepare_v2(db, queryStatement, -1, &dbps, NULL);

//Richiamo la funzione sqlite3_step() finché ho righe nel database
while ((dbrc = sqlite3_step(dbps)) == SQLITE_ROW) {
    int primaryKeyValueI = sqlite3_column_int(dbps, 0);
    NSNumber *primaryKeyValue = [[NSNumber alloc] initWithInt:primaryKeyValueI];
    NSString *itemValue = [[NSString alloc] initWithUTF8String:(char*) sqlite3_column_text(dbps, 1)];
    double priceValueD = sqlite3_column_double(dbps, 2);
    NSNumber *priceValue = [[NSNumber alloc] initWithDouble:priceValueD];
    int groupValueI = sqlite3_column_int(dbps, 3);
    NSNumber *groupValue = [[NSNumber alloc] initWithInt:groupValueI];
    NSString *dateValueS = [[NSString alloc] initWithUTF8String:(char*) sqlite3_column_text(dbps, 4)];
    NSDate *dateValue = [dateFormatter dateFromString: dateValueS];

    NSMutableDictionary *rowDict = [[NSMutableDictionary alloc] initWithCapacity:5];
    [rowDict setObject:primaryKeyValue forKey: ID_KEY];
    [rowDict setObject:itemValue forKey: ITEM_KEY];
    [rowDict setObject:priceValue forKey: PRICE_KEY];
    [rowDict setObject:groupValue forKey: GROUP_ID_KEY];
    [rowDict setObject:dateValue forKey: DATE_ADDED_KEY];

    [shoppingListItems addObject: rowDict];
    NSLog(@"%d", [shoppingListItems count]); //I have a Breakpoint here!

    //rilascio tutti gli elementi
    [dateValue release];
    [primaryKeyValue release];
    [itemValue release];
    [priceValue release];
    [groupValue release];
    [rowDict release];
}
}
#导入“RootViewController.h”
#导入“ProgettoAppDelegate.h”
#导入“AddItemViewController.h”
#导入“DetailViewController.h”
#包括
@RootViewController的实现
@合成负载型细胞;
@合成添加剂;
NSNumberFormatter*价格格式化程序;
NSDateFormatter*日期格式化程序;

NSMutableArray*shoppingListItems 听起来好像您从来没有实际创建要放入
shoppingListItems
中的数组,因此它是零。

您没有显示shoppingListItems的定义,但添加到数组时有两个常见问题:

  • 该数组是NSArray,而不是必须的NSMutableArray
  • 数组为零-您可能使用[NSMUTABLEARRY array]创建了它,但没有显式保留

  • 是的,检查了你的代码-你从来没有初始化过它。解决了这个问题,您应该会没事。

    我在上面的代码中没有看到创建数组的任何内容。如果
    shoppingListItems
    为nil,那么那些
    -addObject:
    消息将不起任何作用。

    您需要将所有变量声明为实例变量,我的意思是在.h文件中,如下所示

    // .h
    @interface RootViewController : UITableViewController {
        UITableViewCell *nibLoadedCell;
        AddItemViewController *addItem;
        IBOutlet UITableView *tableView;
    
        NSNumberFormatter *priceFormatter;
        NSDateFormatter *dateFormatter;
        NSMutableArray *shoppingListItems; // <--- this is only a declaration (not creates the object)
        NSDictionary *editItem;
    }
    
    /.h
    @接口RootViewController:UITableViewController{
    UITableViewCell*nibLoadedCell;
    AddItemViewController*addItem;
    IBUITableView*表格视图;
    NSNumberFormatter*价格格式化程序;
    NSDateFormatter*日期格式化程序;
    
    NSMutableArray*shoppingListItems;//该数组是在顶部创建的NSMutableArray
    #包括@implementation RootViewController@synthesis nibloaddedcell;@synthesis addItem;NSNumberFormatter*priceFormatter;NSDateFormatter*dateFormatter;NSMutableArray*shoppingListItems;
    …它是可变的,我创建为
    NSMutableArray*shoppingListItems;
    您定义了它,但没有创建它。直到您为该指针分配了某些内容(如shoppingListItems=[[NSMutableArray]retain])它是nil和addObject,作为给nil的一条消息,它不会做任何事情。我创建了!我在另一个项目中使用了这段代码,做了同样的事情,但在另一个项目中工作正常,这里我有一个奇怪的问题…和的可能重复
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        shoppingListItems = [NSMutableArray new]; // <---- This create the object
        // other initialization ....
    
        if (!dateFormatter) {
            dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setTimeZone: [NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
            [dateFormatter setDateFormat:@"yyy-MM-dd HH:mm:ss"];
        }
    
        if (! priceFormatter) {
            priceFormatter = [[NSNumberFormatter alloc] init];
            [priceFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
        }
        self.navigationItem.leftBarButtonItem = self.editButtonItem;
    }