2

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

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

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
        }
    }
}
4

1 回答 1

1

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

要解决此问题,请将您的users = [[Users alloc] init];行移到 for 循环中。

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

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

然而,更大的问题是你真的不应该从你自己的班级之外访问 ivar。您应该创建一个声明的属性,而不是拥有一个公共 ivar ( returnData):

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

@property (nonatomic, strong) NSMutableArray *returnData;

然后,您将使用访问器访问它:sql.returnData[sql returnData]代替sql->returnData.

于 2012-12-25T04:31:57.000 回答