私はsqliteデータベースから文字列を正常にロードし、それを使ってオブジェクトを作成するデータベースマネージャを持っています。私はこれらのオブジェクトの複数を配列に追加し、それをクラスから呼び出しています。スコープ外のオブジェクトにつながるsqliteデータベースからロードされた文字列
私はそれを呼び出す方法で返された配列を使用しても問題はありませんが、クラス内の他のメソッドがそれにアクセスしようとすると、文字列要素が範囲外です。
私のrelaventコードです。 DBManager.mで
:XViewController.hで
-(NSArray *)loadObjectData {
NSMutableArray *myArray = [[NSMutableArray alloc] init];
//prepare query and statement
NSString *query = [NSString stringWithFormat:@"SELECT * FROM object;"];
sqlite3_stmt *statement;
//perform query
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) != SQLITE_OK)
NSLog(@"Prepare Error. '%s'", sqlite3_errmsg(database));
//get data
while (sqlite3_step(statement) == SQLITE_ROW) {
//read values
int anInt = sqlite3_column_int(statement, 0);
NSString *aString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
//add new object to list
[myArray addObject:[[Object alloc] initWithID:anInt Name:aString]];
}
if(sqlite3_finalize(statement) != SQLITE_OK)
NSLog(@"Finalize statement error.");
return [myArray autorelease];
}
:XViewController.mで
NSArray *listData;
SessionData *sessionData;
@property (nonatomic, retain) NSArray *listData;
@property (nonatomic, retain) SessionData *sessionData;
:
- (void)viewDidLoad
{
dbMan = [DBManager sharedDBMananager]; //its a singleton
//Load objects to display in table
self.listData = [dbMan loadObjectData];
//if i try to use listData here, it works fine.
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//normal stuff cut out
// Configure the cell...
//the following line fails because the string in the object out of scope
cell.textLabel.text = [[listData objectAtIndex:[indexPath row]] aString];
//trying to access [[listData objectAtIndex:[indexPath row]] anInt] works fine though.
return cell;
}
私はloadObjectData方法で行を(交換した場合):
これで:
NSString *aString = @"String";
すべてが正常に動作します。 Object
クラスで
ありがとうございます。私はそれがsqliteコードの問題だと思っていた。これはそれを固定しました。 –
問題ありません。文字列リテラルとその取り扱い方法を理解するのに役立ちました。 – Brian