2015-03-13 18 views
5

Tôi đã tạo một ứng dụng hoạt động với cơ sở dữ liệu sqlite bên trong ứng dụng. Trước khi iOS 8.2 hoạt động tốt, nhưng sau khi cập nhật, phương thức truy vấn hoạt động chậm hơn khoảng 100 (!!!) lần. Tôi đã cố gắng tìm thông tin về vấn đề này nhưng tôi chưa tìm thấy bất cứ điều gì. Có ai có cùng trải nghiệm không? Đây là phương pháp của tôi đã hoạt động hoàn hảo cho đến bây giờ. Bạn có thấy bất kỳ lỗi hoặc khả năng tối ưu hóa nào bên trong nó không?Truy vấn Sqlite3 thực sự chậm theo iOS 8.2

Cảm ơn sự giúp đỡ của bạn!

- (NSArray *)databaseContentWithQueryString:(NSString *)queryString { 

NSDate *methodStart = [NSDate date]; 

NSMutableArray *retArray = [[NSMutableArray alloc] init]; 

sqlite3_stmt *statement; 
if (sqlite3_prepare_v2(_database, [queryString UTF8String], -1, &statement, nil) == SQLITE_OK) { 
    while (sqlite3_step(statement) == SQLITE_ROW) { 
     int columnCount = sqlite3_column_count(statement); 
     NSMutableArray *valueArray = [[NSMutableArray alloc] init]; 
     NSMutableArray *keyArray = [[NSMutableArray alloc] init]; 
     for (int i=0; i<columnCount; i++) { 
      int type = sqlite3_column_type(statement, i); 
      char *name = (char *) sqlite3_column_name(statement, i); 
      [keyArray addObject:[NSString stringWithFormat:@"%s",name]]; 
      int intVal; 
      char *charVal; 
      if (type == SQLITE_INTEGER) { 
       intVal = sqlite3_column_int(statement, i); 
       [valueArray addObject:[NSNumber numberWithInt:intVal]]; 
      } 
      if (type == SQLITE_TEXT) { 
       charVal = (char *) sqlite3_column_text(statement, i); 
       [valueArray addObject:[NSString stringWithUTF8String:charVal]]; 
      } 
      if (type == SQLITE_NULL) { 
       intVal = 0; 
       [valueArray addObject:[NSNumber numberWithInt:intVal]]; 
      } 
     } 
     NSDictionary *dict = [[NSDictionary alloc] initWithObjects:valueArray forKeys:keyArray]; 
     [retArray addObject:dict]; 
    } 
    sqlite3_finalize(statement); 
} 

//sqlite3_close(_database); 

NSDate *methodFinish = [NSDate date]; 
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart]; 
NSLog(@"executionTime = %f s", executionTime); 

return retArray; 

}

+0

Xin chào, bạn có tìm thấy giải pháp chính xác cho câu trả lời này không? – Hariprasad

Trả lời

0

Hình như đó là ok mảnh của bạn mã, tôi chỉ giải quyết cùng một vấn đề trên đây, khuôn khổ SQLite đã được cập nhật và thay đổi một cái gì đó dưới mui xe. Gỡ rối truy vấn (GIẢI THÍCH KẾ HOẠCH QUERY) Tôi thấy rằng truy vấn của tôi không sử dụng các chỉ mục của tôi ... chỉ cần đảm bảo điều đó.

0

Tôi cũng gặp vấn đề tương tự, chỉ đối với một số truy vấn.

trong truy vấn cũ, trong

FROM (bảng derivate) bên tham gia bàn ...

tôi đã thay đổi thứ tự, trong FROM tên_bảng bên tham gia (bảng derivate) ... Tôi biết đó là lạ, nhưng truy vấn là nhanh chóng

0

Tôi có thể trễ để trả lời câu hỏi này, nhưng FWIW: Tôi có một vấn đề rất giống với một truy vấn phức tạp, thời gian chạy tạo ra, mà tôi không thể thực sự gây rối. Nó chạy rất nhanh trên tất cả các thiết bị và tất cả các phiên bản iOS, trừ khi chạy dưới iOS 8.2. Không cần phải nói, khách hàng của chúng tôi đã phàn nàn về những ngày về nó.

Hôm nay tôi đã tìm thấy một giải pháp đơn giản có vẻ hoạt động. KHÔNG liên kết với không sqlite3.dylib cũng không phải sqlite3.0.dylib. Thay vào đó, download mã nguồn hỗn hợp SQLite, bao gồm tệp C và tiêu đề, do đó, nó chỉ là một thao tác kéo thả nhanh vào dự án của bạn. Sau đó, thay thế tất cả bạn

#import <sqlite3.h> 

bởi

#import "sqlite3.h" 

Và chạy ứng dụng của bạn một lần nữa, nó sẽ hoạt động giống như trên iOS 8.1 và các phiên bản trước.

2

Một vài thứ đã thay đổi:

  • Trong iOS 8.2, sqlite được nâng cấp từ 3.7.13 đến 3.8.5 *
  • Trong sqlite 3.8.0, các nhà quy hoạch truy vấn đã được thay thế bằng một ' Next Generation Query Planner '

Sự kết hợp của hai thay đổi này có thể là nguyên nhân gây ra vấn đề hiệu suất của bạn. Trong khi NGPQ có khả năng cải thiện hiệu suất của nhiều truy vấn phức tạp, nó sẽ có ảnh hưởng tiêu cực đến một vài truy vấn phức tạp, giống như của bạn (và của tôi!).

Để giải quyết vấn đề của bạn, tôi sẽ xem xét truy vấn cụ thể của bạn để xem liệu bạn có thiếu bất kỳ chỉ mục nào có thể cải thiện hiệu suất của bạn hay không. Sử dụng EXPLAIN QUERY PLAN có thể cung cấp cho bạn một số thông tin chi tiết về những gì đang diễn ra.

  • Đáng tiếc, tôi không thể tìm thấy nguồn tốt hơn cho sự thay đổi cho iOS khác hơn tweet và độ sâu của một số bài đăng trên diễn đàn công nghệ.
Các vấn đề liên quan