2011-12-22 13 views
8

tôi đang sử dụng FMDB wrapper i sử dụng mã nàylàm thế nào để giải quyết Lỗi gọi sqlite3_step (21: ra khỏi bộ nhớ) rs trong FMDB

- (BOOL)update:(NSString *) Body fromValue:(NSString *)froms { 

    BOOL success = NO; 
    FMResultSet *rs; 
//I have **searchTable** and in that folder name **OFFICE** 

    rs = [self.database executeQuery:@"select searchId,body from searchTable WHERE folder = 'OFFICE'"]; 


    NSInteger primaryKey = -1; 
    NSString *body = nil; 
    NSString *md5OfSearchEmailBody = nil; 
    while ([rs next]) { 
     primaryKey = [rs intForColumn:@"searchId"]; 
     body = [rs stringForColumn:@"body"]; 
    }   

    [rs close]; 
    return success; 
} 

lần đầu tiên

- (BOOL)update:(NSString *) Body fromValue:(NSString *)froms{ 
} 

phương pháp làm việc tốt. trong lần thứ hai vòng lặp nó không làm việc

Lỗi sqlite3_step gọi (21: ra khỏi bộ nhớ) rs

làm thế nào để giải quyết vấn đề này

+2

Bạn giải quyết vấn đề này như thế nào? Tôi thấy bạn đã đánh dấu câu trả lời là chính xác nhưng tôi muốn biết bạn đã làm gì, bởi vì tôi có cùng một vấn đề. Bạn đã khắc phục được sự cố hay bạn chuyển sang Dữ liệu cốt lõi? – Fellowsoft

Trả lời

5

Kiểm tra cho [rs close];

Có thể là nó được phát hành hoặc đóng DB.

============================================== =====

Sử dụng tốt hơn CoreData để triển khai sqlite trong ứng dụng của bạn.

Tại sao sử dụng thư viện bên ngoài, khi có thư viện nội bộ tốt hơn trong Ứng dụng. Bạn không cần phải loại bỏ bảng sqlite của bạn. Bạn có thể dễ dàng di chuyển cơ sở dữ liệu hiện có của mình sang CoreData.

0

tôi đã hết bộ nhớ ngay cả sau khi [rs đóng]; vì vậy tôi đã sử dụng:

while ([rs next]) { 
     @autoreleasepool 
     { 
      //stuff like......[rs stringForColumn:@"category_id"];... 
     } 
       } 
     [rs close]; 

tôi đã giải quyết được sự tăng trưởng của mory cũng như lỗi bộ nhớ.

Cảm ơn

0

Tôi đang đối mặt với cùng một lỗi. Vì vậy, về cơ bản tôi đã có hai chức năng, nói func1() và func2().

Trong Func1() Tôi đã làm như sau:

1.) Tạo tập kết quả. 2.) In kết quả (Để kiểm tra) 3.) Gọi func2() với kết quả được đặt làm đối số.

Trong func2(), tôi đã gặp lỗi trong khi tôi đang cố gắng lặp qua tập hợp kết quả nhận được từ func1().

Khi tôi xóa mã trong func1() (Bước 2), lỗi đã biến mất!

3

Tôi đã gặp lỗi tương tự vì gọi [database close] trước khi gọi [resultSet next].

FMDatabase *db; 

[db open]; 

FMResultSet *set = [db executeQuery:@"some select"]; 

[db close]; 

while ([set next]) 
{ 
    // get Error calling sqlite3_step (21: out of memory) rs 
} 

[set close]; 

nên gọi [cơ sở dữ liệu chặt chẽ] sau khi cuộc gọi [ResultSet tiếp theo]

FMDatabase *db; 

[db open]; 

FMResultSet *set = [db executeQuery:@"some select"]; 

while ([set next]) 
{ 
    // no error 
} 

[set close]; 
[db close]; 
0

Để giải quyết ra khỏi vấn đề bộ nhớ, tôi đã phải thiết lập mã của tôi như dưới đây để kiểm tra ở phần cuối của vòng lặp nếu loop == LocationCount sau đó phá vỡ vòng lặp. Nếu tôi để nó ra nó sẽ [rs tiếp] mà sau đó sẽ cho tôi các lỗi gọi sqlite3_step (21: ra khỏi bộ nhớ) rs. Tôi sẽ khuyên bạn nên làm một cái gì đó tương tự như vậy [rs tiếp theo] không quá nhiều hơn những gì cần thiết cho chức năng của bạn.

int loop = 0; 
while ([rs next]) 
    { 
     // additional code here 
     loop = loop + 1; 
     if (loop == LoopMaxCount) { 
       break; 
     } else { 
       [rs next]; 
     } 
    }