从NSMutableArray按顺序返回字符串

时间:2013-06-04 14:53:10

标签: objective-c cocoa-touch ios6

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

理想情况下,我还有一个反转功能,即从当前位置向后移动数组。

这可能是非常基本的,但我似乎只能找到更多高级实现,我无法在字符串数组中向前和向后转换为循环。

编辑:以下此功能的当前代码。我需要添加一次从数组返回一个字符串的部分(allRows)并在textview中显示

- (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];

}

非常感谢您的帮助!

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

你提到你是Objective C的新手,并且基于我如何阅读你所描述的内容,我想知道你是否让它变得比它需要的复杂得多。数组中的项(即NSArrayNSMutableArray)不会被任何东西“分离” - 数组中的不同项通过它们在数组中的顺序访问,称为{{1} }。因此,在您的代码中,当您构建index时,您放入其中的每个allRows都会被放入其自己的str中,并将其从数组中取回,您只需使用它index

例如,让我们假装你从数据库中提取的引号是:

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

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

myTextField

最后,这意味着你可能想要为你的应用做的是保留一个你传递给myTextField.text = [allRows objectAtIndex:2]; 的计数器。当用户单击前进按钮时,增加计数。单击后退按钮时,减少计数。然后,调用我上面的代码,除了不发送值objectAtIndex,发送您的计数器变量。正如在对H2CO3s的评论中所提到的那样,请确保在那里进行一些验证以防止您的计数超出阵列的限制,否则您将遇到令人讨厌的崩溃。如果这确实是你想要做的,而你仍然感到困惑,我可以添加更多的代码。

我不太熟悉以这种方式访问​​sqlite数据库(我使用CoreData,因此调用非常不同),所以也许我完全弄错了你想在这里做什么 - 但这似乎就像一个非常简单的任务,非常简单。

答案 2 :(得分: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;
}