Sqlite崩溃应用程序

时间:2012-01-10 12:16:13

标签: iphone objective-c sqlite

我正在使用此代码向表中插入名称,我有一个问题,即150 +/-使用此日志命名应用程序崩溃:

 Received memory warning. Level=1
 Received memory warning. Level=2

这是代码,我做错了什么?

if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {
    for (int i = 0 ; i < count; i++) {          
        sqlite3_stmt *insertStmt = nil;
        NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];

        if(insertStmt == nil) 
        {
            NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
            const char *insertSql = [statement UTF8String];

            if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
                NSLog(@"Error while creating insert statement.");
                insertStmt = nil;
                continue;
            }

            sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);


            if(SQLITE_DONE != sqlite3_step(insertStmt)){
                NSLog(@"Error while inserting data.");
                insertStmt = nil;
                continue;
            }
            else{}

            sqlite3_reset(insertStmt);
            insertStmt = nil;
        }

        [delegate IPodLibraryFinishEntity:self];
    }

    sqlite3_close(database);

}

3 个答案:

答案 0 :(得分:1)

使用仪器检查由于保留但未泄漏的内存导致的内存丢失。后者是未使用的内存,仍然指向。在仪器上的分配工具中使用快照。

如何使用“快照”查找内存褶皱,请参阅:bbum blog

基本上有一种方法是运行仪器分配工具,获取快照,运行代码直观和另一个快照重复3或4次。这将指示在迭代期间分配但未释放的内存。

要弄清楚披露的结果,以查看个别分配。

如果您需要查看对象使用仪器的保留,释放和自动释放的位置:

在仪器中运行,在分配中设置“记录参考计数”(您必须停止记录以设置选项)。导致选择器运行,停止记录,搜索那里的ivar(datePickerView),向下钻取,你将能够看到所有保留,释放和自动释放发生的位置。

答案 1 :(得分:0)

在开始每个Insert语句之前,使用 sqlite3_open 并在执行查询后输入 sqlite3_close 语句。因此,在每次执行Insert查询后,它不会再使数据库对象忙。

答案 2 :(得分:0)

您的代码不是最佳的。您应该在循环之前放置所有准备方法。

if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {

    sqlite3_stmt *insertStmt = nil;
    NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];

    if(insertStmt == nil) {
        NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
        const char *insertSql = [statement UTF8String];

        if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
            NSLog(@"Error while creating insert statement.");
            insertStmt = nil;
            return;
        }
    }
    for (int i = 0 ; i < count; i++) {          
        sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);

        if(SQLITE_DONE != sqlite3_step(insertStmt)){
            NSLog(@"Error while inserting data.");
            continue;
        }
        else{}

        sqlite3_clear_bindings(insertStmt); //release bindings
        sqlite3_reset(insertStmt);

        [delegate IPodLibraryFinishEntity:self];
    }
    sqlite3_close(database);
}