-2

我有一个带有逗号分隔字符串的 NSMutableArray,用于 Objective-c iphone 应用程序(iOS SDK 6.0)。我需要一个简单的函数,当触发时,从字符串 0 开始,一次返回一个字符串。为了给您一些上下文,用户将单击一个按钮,并且每次单击都会从数组中按顺序返回一个新字符串。这是以前保存的“最喜欢的报价”列表。字符串显示在 UITextView 中。

理想情况下,我还会有一个反转功能,即从当前位置在数组中倒退。

这可能是非常基本的,但我似乎只能找到更高级的实现,而我无法将其转换为字符串数组中的这种来回循环。

编辑:下面这个函数的当前代码。我需要添加一次从数组(allRows)返回一个字符串并显示在文本视图中的部分

- (IBAction)nextQoute:(id)sender {
const char *dbpath = [_databasePath UTF8String];
sqlite3_stmt    *statement;

if (sqlite3_open(dbpath, &_qoutesDB) == SQLITE_OK)
{
    NSString *querySQL = [NSString stringWithFormat:
                          @"SELECT qoutesSaved FROM qoutes"];

    const char *query_stmt = [querySQL UTF8String];

    if (sqlite3_prepare_v2(_qoutesDB,
                           query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {
        NSMutableArray *allRows = [[[NSMutableArray alloc] init] autorelease];

        while (sqlite3_step(statement) == SQLITE_ROW)
        {
            NSString *qouteField = [[NSString alloc]
                                   initWithUTF8String:
                                   (const char *) sqlite3_column_text(
                                                                      statement, 0)];

            NSString *str = [NSString stringWithFormat:@"%@", qouteField];

            [allRows addObject:str];
            [qouteField release];

}

非常感谢帮助!

4

3 回答 3

1

您提到您是 Objective C 的新手,根据我如何阅读您所描述的内容,我想知道您是否让这变得比它需要的复杂得多。数组中的项(即NSArrayNSMutableArray)不会被任何东西“分隔”——数组中的不同项按它们在数组中的顺序访问,称为index。因此,在您的代码中,当您构建时,您放入其中的allRows每个str都会放入自己indexindex.

例如,假设您从数据库中提取的报价是:

  • “孩子,看你的了”
  • “我会回来的”
  • “这是一个陷阱”

如果它们按该顺序放入数组中,并且您想将“这是一个陷阱”放入文本字​​段(称为myTextField)中,则只需编写

myTextField.text = [allRows objectAtIndex:2];

最后,这意味着您可能想要为您的应用程序做的是保留一个您传递给的计数器objectAtIndex。当用户单击前进按钮时,增加计数。当他们单击后退按钮时,减少计数。然后,调用我在上面放置的代码,除了发送 value 之外2,发送你的 counter 变量。正如对 H2CO3s 答案的评论中所述,请确保您在其中进行了一些验证,以防止您的计数超出阵列的限制,否则您将遇到严重的崩溃。如果这确实是您正在尝试做的事情并且您仍然感到困惑,我可以添加更多代码。

我不太熟悉以您在这里的方式访问 sqlite 数据库(我使用 CoreData,所以调用非常不同),所以也许我完全误解了您在这里尝试做的事情 - 但这似乎是一个非常非常复杂的简单任务。

于 2013-06-04T18:26:12.983 回答
1

您可以只跟踪实例变量中的字符串索引(或者如果您没有要使用的对象,因为您编写了类方法或函数而不是实例方法,那么您也可以使用静态局部变量)。

@interface Foo: NSObject {
    NSInteger index;
    NSArray *strings;
}

// ...

- (NSString *)nextString
{
    return index < strings.count ? strings[index++] : nil;
}

- (NSString *)previousString
{
    return index > 0 ? strings[--index] : nil;
}
于 2013-06-04T14:59:06.667 回答
0
You can fetch the whole data in database.And store it one array
declare these two objects.
@interface YourClassName: NSObject {
     NSInteger stringIndex;
    NSArray *quoteFieldDataArr;
}


NSMutableArr *quoteFieldDataArr=[self fetchDataFromDataBase];

-(NSMutableDictionary *)fetchDataFromDataBase
{

    const char *dbpath = [_databasePath UTF8String];
    sqlite3_stmt    *statement;

    if (sqlite3_open(dbpath, &_qoutesDB) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat:
                              @"SELECT qoutesSaved FROM qoutes"];

        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(_qoutesDB,
                               query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            NSMutableDictionary *allRows = [[[NSMutableDictionary alloc] init] autorelease];

            while (sqlite3_step(statement) == SQLITE_ROW)
            {
                NSString *qouteField = [[NSString alloc]
                                        initWithUTF8String:
                                        (const char *) sqlite3_column_text(
                                                                           statement, 0)];

                NSString *str = [NSString stringWithFormat:@"%@", qouteField];

                [allRows addObject:str];
                [qouteField release];


    return nil;
}

// Load Next String
- (NSString *)loadNextString
{
    return stringIndex < quoteFieldDataArr.count ? quoteFieldDataArr[stringIndex++] : nil;
}

- (NSString *)loadpreviousString
{
    return stringIndex > 0 ? quoteFieldDataArr[--stringIndex] : nil;
}
于 2013-06-05T20:22:37.497 回答