2009-05-17 38 views

Trả lời

8

Tôi có thể khuyên bạn sử dụng FMDB làm trình bao bọc Cocoa SQLite đẹp mắt.

+0

Bạn có chắc là bộ nhớ bị rò rỉ miễn phí, an toàn để sử dụng, v.v. không? Nó chắc chắn không hoàn chỉnh và dường như không được hỗ trợ. Tôi nói, đi với CoreData và điều chỉnh hiệu suất khi (nếu) nó được xấu – melfar

+0

Khi xem xét ứng dụng của tôi cho rò rỉ, tôi không bao giờ tìm thấy bất kỳ bên trong thư viện. – pgb

+0

Đây có thể là một liên kết tốt hơn http://code.google.com/p/flycode/source/browse/#svn/trunk/fmdb –

6

Off đỉnh đầu của tôi:

  • Sử dụng giao dịch.
  • Đảm bảo SQL của bạn tận dụng các bảng trong correct order.
  • Không thêm chỉ mục mà bạn không hoàn toàn chắc chắn mình cần.

Có lẽ không chỉ dành riêng cho iPhone mà còn cho các thiết bị nhúng có một số mẹo tuyệt vời here.

Điều này link liên quan đến phiên bản cũ hơn của SQLite nhưng vẫn chứng tỏ hữu ích.

Cuối cùng, Stack Question này cũng có một số thông tin tốt.

Chúng tôi sử dụng SQLite với ứng dụng .NET Framework Framework hiện tại và hiệu suất của nó thật tuyệt vời và chúng tôi đã dành một chút thời gian để tối ưu hóa nhưng không gần như hết mức có thể.

Chúc bạn may mắn.

8

Đo lường dấu vết bộ nhớ của ứng dụng và tìm rò rỉ trong Dụng cụ. Sau đó thử nó sau khi gọi sqlite3_exec với:

  • pragma cache_size=1

và/hoặc

  • pragma synchronous=0

YMMV. Có các báo cáo về tăng hiệu suất, giảm thiểu sử dụng RAM và ít rò rỉ hơn. Tuy nhiên, hãy cẩn thận khi thực hiện các điều chỉnh mà không hiểu tác động (ví dụ: synchronous tắt xả mà tăng tốc độ nhiều thứ, nhưng có thể gây hỏng DB nếu điện thoại bị cúp điện vào thời điểm sai).

More đây: http://www.sqlite.org/pragma.html

+1

+1 cho điều này cache_size có thể ăn khá nhiều bộ nhớ trên iphone và tôi mất một lúc trước khi tôi tìm thấy điều này. – paulthenerd

3

Tôi đã phát hiện ra rằng nó thường nhanh hơn để chỉ nhận được ID Tôi đang tìm kiếm trong một truy vấn phức tạp và sau đó nhận được phần còn lại của các thông tin theo yêu cầu.

Vì vậy, ví dụ:

SELECT person_id 
    FROM persons 
WHERE (complex where clause) 

và sau đó là mỗi người đang được hiển thị, tôi sẽ chạy

SELECT first_name, last_name, birth_date, ... 
    FROM persons 
WHERE person_id = @person_id 

tôi thường tìm thấy điều này làm cho thời gian truy vấn phức tạp trong 1/2 thời gian và tra cứu cho một người cụ thể thường là theo thứ tự 2ms (đây là trên các bảng có 17k hàng).

Trải nghiệm của bạn có thể thay đổi và bạn nên tự thời gian.

Ngoài ra, tôi phải cung cấp tín dụng cho Wil Shipley để đề xuất kỹ thuật này trong bài nói chuyện của mình tại đây: http://www.vimeo.com/4421498.

Tôi thực sự sử dụng mẫu hydrat hóa/khử nước rộng rãi từ các sách sqlitebook, đây là một phần của kỹ thuật này.

1

Tôi lười biếng và muốn gắn bó trong mã lõi càng nhiều càng tốt, vì thế tôi thích SQLitePersistentObjects công cụ ORM:

http://code.google.com/p/sqlitepersistentobjects/

Bạn làm cho đối tượng mô hình tên miền của bạn kế thừa từ SQLitePersistentObject (ok một chút xâm nhập) và sau đó bạn có thể tiếp tục/truy xuất các đối tượng của mình nếu cần.

Để tồn tại:

[person save]; 

tải nó trở lại là gần như là dễ dàng. Bất kỳ đối tượng bền vững nào cũng có thể thêm các phương thức lớp động để cho phép bạn tìm kiếm. Vì vậy, chúng ta có thể lấy tất cả các đối tượng Person rằng có một tên cuối cùng của "Smith" như vậy:

NSArray *people = [PersistablePerson findByLastName:@"Smith"]; 
0

Một lựa chọn khác mà tôi đã không cố gắng chưa là Core Data (cần phải Apple iphone dev), mặc dù nó một tính năng 3.0 và vì vậy nó phụ thuộc vào ứng dụng của bạn cho dù thats một tùy chọn ..

+0

Tất cả các bản đăng ký ứng dụng hiện tại cần được xây dựng với SDK 3.0, vì vậy tôi muốn nói rằng Dữ liệu cốt lõi có lẽ là tùy chọn tốt nhất. –

+0

Theo tôi hiểu, việc gửi không cần phải được xây dựng với 3.0, nó sẽ chỉ được thử nghiệm với nó: "tất cả các lần gửi tới App Store sẽ được xem xét trên bản beta mới nhất của iPhone OS 3.0. Nếu ứng dụng của bạn không được gửi tương thích với iPhone OS 3.0, nó sẽ không được chấp thuận. " –

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