我有一个带有逗号分隔字符串的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];
}
非常感谢您的帮助!
答案 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的新手,并且基于我如何阅读你所描述的内容,我想知道你是否让它变得比它需要的复杂得多。数组中的项(即NSArray
或NSMutableArray
)不会被任何东西“分离” - 数组中的不同项通过它们在数组中的顺序访问,称为{{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;
}