2013-05-26 30 views
5

Tôi chạy một loạt truy vấn trong suốt vòng đời của ứng dụng.Khi nào cần mở và đóng một SQlite DB trong vòng đời của iOS?

Tôi hiện đang sử dụng FMDB (Trình bao bọc Objective-C xung quanh API Sqlite C) và tôi đang mở và đóng trước mỗi truy vấn.

FMDatabase * db = [FMDatabase databaseWithPath:pathToMyDB]; 
[db open] 
FMResultSet * s = [db executeQuery:@"SELECT * FROM myTable"]; 
// Use FMResultSet 
[db close]; 

Mở và đóng cò fopen()fclose() thấp xuống, do đó I belive tôi có thể đạt được một chiến thắng cực chẳng đả bằng cách giữ cho cơ sở dữ liệu mở.

Tuy nhiên, tôi tin rằng các đối tượng tạm thời sẽ tích tụ, điều này có thể dẫn đến các vấn đề về bộ nhớ. Closing the database xóa các vật thể tạm thời.

  • Khi nào tôi nên mở và đóng kết nối cơ sở dữ liệu? (ví dụ: Ứng dụng đã nhập backgound?)
  • Tôi có nên chạy VACUUM trong các tình huống bộ nhớ thấp không?

Trả lời

1

Cơ sở dữ liệu không tạo và/hoặc giữ bất kỳ đối tượng nào (hoặc ít nhất là không nên). API C chỉ là một cách thuận tiện để sử dụng các truy vấn SQL nhưng một khi chúng được thực hiện, chúng sẽ được giải phóng.

Bây giờ, đối với các đối tượng trả về của một truy vấn, chúng chỉ được sao chép vào FMResultSet của bạn. Một khi bạn phát hành rằng họ đã biến mất.

Imo, nếu bản thân cơ sở dữ liệu không quá lớn, bạn nên giữ một tham chiếu đến nó trong đại biểu ứng dụng của bạn (đảm bảo được sống trong suốt thời gian ứng dụng của bạn). Khi bạn nhập ứng dụng/tiếp tục từ nền mở cơ sở dữ liệu và khi bạn đi vào nền/đóng chỉ cần đóng nó.

Hãy nhớ rằng AppDelegate là một đơn (tôi nghĩ) và bạn có thể truy cập cơ sở dữ liệu của mình bằng cách sử dụng (AppDelegate*)[[UIApplication sharedApplication]delegate].your_db từ bất kỳ đâu trong ứng dụng của bạn để thực hiện các truy vấn thực tế.

Sử dụng VACUUM sẽ làm hỏng ứng dụng của bạn nếu bạn cố gọi nó khi bạn nhận được cảnh báo bộ nhớ. Hãy suy nghĩ về điều này: để sắp xếp lại cơ sở dữ liệu, nó sẽ được nạp vào bộ nhớ (hoặc ít nhất là một phần của nó), nếu bạn đã có cảnh báo bộ nhớ ... poof ... crash.

Bạn có thể kiểm tra xem cơ sở dữ liệu của mình có lưu giữ các đối tượng trong bộ nhớ hay không. Chỉ cần thực hiện như 100 truy vấn tại khoảng thời gian 1s (hoặc một nút bấm) và xem ở các công cụ ở đâu và nếu bộ nhớ tăng lên. Bạn có thể bị rò rỉ trong ứng dụng của mình (hoặc trong chính trình bao bọc) và bạn đổ lỗi cho nó trên cơ sở dữ liệu.

+0

Cảm ơn bạn đã trả lời. Bạn có chắc chắn 100% rằng cơ sở dữ liệu không tạo và/hoặc giữ bất kỳ đối tượng nào không? Bạn có lẽ đúng, nhưng, tài liệu này nói: "trả về SQLITE_OK nếu đối tượng sqlite3 bị hủy thành công ** và tất cả các tài nguyên liên quan được deallocated **" http://www.sqlite.org/c3ref/close.html – Robert

+0

Tôi nghĩ rằng các tài nguyên liên quan đề cập đến chính kết nối đó và một số thứ khác mà bạn cần truy cập. Như tôi đã nói, tôi không chắc chắn, máy chủ cơ sở dữ liệu làm điều này. Sau đó, một lần nữa họ không cần phải được mở ra, mỗi se. Làm như tôi đã nói, kiểm tra nó như: trong một cơ sở dữ liệu mở lớp riêng biệt, thực hiện một số lượng vô lý các truy vấn (trong khi xem bộ nhớ) và sau đó đóng nó. Nó sẽ được rõ ràng những gì đang xảy ra. Nếu nó giữ một số đối tượng bạn sẽ thấy rằng bộ nhớ tiếp tục phát triển cho đến khi ứng dụng gặp sự cố, nếu không phải mọi thứ sẽ vẫn ở cấp độ bộ nhớ liên tục tương đối. Đó là cách dễ nhất để chắc chắn. – skytz

Các vấn đề liên quan