【问题标题】:Having problems accessing my NSArray objects that are being loaded with sqlite data访问正在加载 sqlite 数据的我的 NSArray 对象时遇到问题
【发布时间】:2012-12-26 06:10:17
【问题描述】:

我认为这应该如何工作存在一些基本的误解,我将不胜感激。我一直在尝试编写一些函数,这些函数将从 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
        }
    }
}

【问题讨论】:

    标签: xcode arrays sqlite object nsmutablearray


    【解决方案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-&gt;returnData

    【讨论】:

    • 感谢您的快速回答,感谢您的帮助。现在一切正常。我采纳了您关于将 returnData 设为私有的建议。现在这对内存管理有好处吗?由于我可能正在开发许多涉及大量数据库管理的应用程序,因此我一直在考虑开始研究更通用的 sqlite 包装器。我在这个应用程序中使用的更针对特定表格。开发更完整的 API 是否值得?或者只是根据需要制作有针对性的功能?
    • 就像编程中的大多数事情一样,这取决于。你必须根据你所知道的来决定,花在制作通用东西上的额外时间是否会至少为你在其他项目上节省那么多时间。很高兴我能帮忙!至于使用声明的属性而不是 ivar,看看这个问题:stackoverflow.com/q/4142177/937822
    • Hmmmm....这让事情变得更清晰了一点'[X complexThingHere]'。 :) 如前所述,我是一名 Objective C 初学者,我很感激花时间帮助我的教育。
    • 任何时候,这就是我们都在这里的原因:互相帮助。欢迎提出更多问题,并请回答您更熟悉的主题的问题,以便我们都能在这里完成我们的目标!
    • 好吧,我会成为一个害虫,带你去做'问更多问题'的事情。 :) 当我退出序列时,我想找到一种执行代码块的方法。又名:“选择个人资料”屏幕,其中包含“添加新个人资料”。当 segue 结束并返回到“选择配置文件”视图时,我想更新表格视图以包含新的配置文件。我已经以不同的方式提出了这些问题,但还没有收到任何问题。 stackoverflow.com/questions/14062532/…stackoverflow.com/questions/14030901/…
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 2021-03-31
    • 2021-05-12
    • 2019-12-03
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多