变量不是字符串

时间:2012-10-01 15:36:54

标签: iphone objective-c

我在Xcode中创建了一个字符串,如下所示:

@property (nonatomic, retain) NSString *lati;

我也合成了它......

现在在我的视图中,我通过这个功能得到了我的理解:

- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation {
    int degrees = newLocation.coordinate.latitude;
    double decimal = fabs(newLocation.coordinate.latitude - degrees);
    int minutes = decimal * 60;
    double seconds = decimal * 3600 - minutes * 60;
    lati = [NSString stringWithFormat:@"%d° %d' %1.4f\"",
                 degrees, minutes, seconds];
    //latLabel.text = lat;
    degrees = newLocation.coordinate.longitude;
    decimal = fabs(newLocation.coordinate.longitude - degrees);
    minutes = decimal * 60;
    seconds = decimal * 3600 - minutes * 60;
    longi = [NSString stringWithFormat:@"%d° %d' %1.4f\"",
                   degrees, minutes, seconds];
}

后来我想在我的slite3数据库中保存一些字符串,但是我得到了Bad_Access,因为我的Lati String没有正确设置,但我不知道为什么......这是我的SaveToDB方法:

if (sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK) {
    NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO DATEN(download, upload, ping, comment, date, network, latitude, longitude) VALUES (\"%@\", \"%@\", \"%@\",\"%@\", \"%@\",\"%@\", \"%@\",\"%@\")",topDownloadLabel.text, topUploadLabel.text, pingLabel.text, Comment, string, WlanOrUmts, lati, longi];

我得到了Bad_Access。

2 个答案:

答案 0 :(得分:3)

您使用的是iVar而不是property,只需尝试

即可
self.lati = …

,而不是...

编辑:对不起,我在写答案的同时错过了评论并同时拨打了电话; - )

答案 1 :(得分:0)

现在一切都很好,将我的字符串保存到数据库,但在下一步我想读出我的数据库中的字符串......一切都很好......

-(NSMutableArray *) daten{
daten = [[NSMutableArray alloc] initWithCapacity:100];
@try {
    NSFileManager *fileMgr = [NSFileManager defaultManager];
    NSString *dbPath = [self getDBPath];
    BOOL success = [fileMgr fileExistsAtPath:dbPath];
    if(!success)
    {
        NSLog(@"Cannot locate database file '%@'.", dbPath);
    }
    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
    {
        NSLog(@"An error has occured: %s", sqlite3_errmsg(db));

    }


    const char *sql = "SELECT * FROM  Daten";
    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
    {
        NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
    }else{

        while (sqlite3_step(sqlStatement)==SQLITE_ROW) {
            Daten * infos = [[Daten alloc] init];
            infos.download = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)];
            infos.upload = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,2)];
            infos.ping = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,3)];
            infos.comment = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,4)];
            infos.date = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,5)];
            infos.type = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,6)];
            infos.lati = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,7)];
            infos.longi = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,8)];


            [daten addObject:infos];
        }
    }
}
@catch (NSException *exception) {
    NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
}
@finally {
    sqlite3_finalize(sqlStatement);
    sqlite3_close(db);

    return daten;
}
}

但是如果我想将这些值传递给我的prepareForSegue方法中的下一个视图,我会得到一个Bad_Access:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"showDetails"])
{
    @try {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
        Daten *date = [[Daten alloc] init];
        date = [daten objectAtIndex: storyIndex];
        UINavigationController *navController = (UINavigationController*)[segue destinationViewController];
        DetailViewController *eventsController = [navController topViewController];
        [eventsController setDownload:date.download];
        [eventsController setUpload:date.upload];
        [eventsController setPing:date.ping];
        [eventsController setComment:date.comment];
        [eventsController setNetwork:date.type];
        //NSLog(@"The content of arry is%@",daten);
        [eventsController setDate:date.date];
        UINavigationController *navigationController = segue.destinationViewController;
        DetailViewController *DetailsViewController = [[navigationController viewControllers] objectAtIndex:0];
        DetailsViewController.delegate = self;

    }
    @catch (NSException *exception) {
        NSLog(@"%@", exception);
    }
    @finally {

    }
        }
}

但仅限于date.date或date.type ....