访问使用sqlite数据加载的NSArray对象时遇到问题

时间:2012-12-25 03:27:00

标签: xcode arrays sqlite object nsmutablearray

我认为对于这应该如何运作存在一些基本的误解,我将不胜感激任何帮助。我一直在尝试编写一些函数来从sqlite表中提取数据,将它放在一个对象中,然后将该对象保存到一个数组中。然后,其他例程将访问该数组。本课程还有很多内容,我不想堵塞论坛。我遇到的问题是:

1)我似乎只能访问放入数组的最终值。我是否将'User'对象错误地保存到数组中?

2)假设我在数组中正确获取了对象,我是否正确地将它们拉出来?我在底部添加了一个样本拉动程序。

3)任何有经验的人都能提到一种更有效的方法吗?我仍然试图让我的xcode编程支持我,并希望能够编写更清晰的代码。

// ** SQLiteFunctions标题

#import <sqlite3.h>
#import "Users.h"

@interface SQLiteFunctions : NSObject
{
@public
    // initializing public variables
    NSMutableArray *returnData;

@private
    // initializing private variables
    sqlite3 *dbPointer;
    sqlite3_stmt *sqlStatement;
    NSArray *paths;
    NSString *documentsDirectory;
    NSString *databasePath;
    char *error;
    Users *users;
}

// initializing public member functions
-(BOOL)openDatabase: (NSString *) table_name;
-(BOOL)openBundleDatabase;
-(BOOL)openNonBundleDatabase;
-(void)closeDatabase;
-(BOOL)getRecords:(const char *)sqlquery;
-(int)getUserRecords:(const char *)sqlquery;

@end

// ** SQLiteFunctions实现

-(int)getUserRecords:(const char *)sqlquery
{
    // retreiving database values
    users = [[Users alloc] init];

    // initializing return data array
    returnData = [[NSMutableArray alloc] init];

    // testing prepare statement for verse sql
    if(sqlite3_prepare(dbPointer, sqlquery, -1, &sqlStatement, NULL) == SQLITE_OK)
    {
        // looping through existing return rows
        while (sqlite3_step(sqlStatement)==SQLITE_ROW)
        {
            // retreiving database values
            users->user_id = sqlite3_column_int(sqlStatement,0);
            users->user_name = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 1)];

            // adding verse object to the return data array
            [returnData addObject:users];
        }
    }
    else
    {
        // logging problem with prepare
        NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(dbPointer));
        return NO;
    }

    // returning number of rows in the array
    return [returnData count];
}

// **样本用法

// retreiving the number of users from the database
SQLiteFunctions *sql = [[SQLiteFunctions alloc] init];
Functions *func = [[Functions alloc] init];

// testing for successful open
if([sql openDatabase:@"users"])
{
    // testing for that profile name existing already
    if([sql getUserRecords:[func strCat:@"SELECT * FROM  users;":nil:nil:nil:nil]] > 0)
    {
        int user_id;
        NSString *user_name;
        for(Users *myUser in sql->returnData)
        {
            user_id = myUser.user_id;
            user_name = myUser.user_name;
            // do other stuff with values
        }
    }
}

1 个答案:

答案 0 :(得分:1)

将对象添加到阵列时出现问题
您的数组的问题在于您不断更新 User对象的相同实例的值,并将其一遍又一遍地添加到数组中。

要解决此问题,请在for循环内移动users = [[Users alloc] init];行。

访问数组中的对象
如果需要遍历所有(或至少很多)对象,则访问数组中的对象很好。如果您只需要特定对象,则可以使用:

Users *user5 = [sql->returnData objectAtIndex:5];

然而,更大的问题是,真的不应该从您自己的课外访问ivar。您应该创建一个声明的属性:

,而不是使用公共ivar(returnData

首先,删除ivar声明行(NSMutableArray *returnData;),然后在包含所有ivar(位于// initializing public member functions评论上方)的块之后添加:

@property(非原子,强)NSMutableArray * returnData;

然后,您可以使用访问者访问它:sql.returnData[sql returnData]而不是sql->returnData