2013-06-28 35 views
7

Tôi phải thêm dữ liệu khổng lồ vào cơ sở dữ liệu SQLite và cần một số gợi ý về cách tôi có thể thực hiện chức năng đó trong iOS. Tôi phải đồng bộ hóa xung quanh 1   GB dữ liệu từ máy chủ đến cơ sở dữ liệu SQLite iPhone.Lưu trữ dữ liệu khổng lồ trong SQLite

Tôi cần các cách khác để lưu trữ dữ liệu nhanh trong cơ sở dữ liệu ở phía iOS. Tôi đã cố gắng để lưu trữ dữ liệu từng người một, nhưng nó mất quá nhiều thời gian để đồng bộ hóa và lưu trữ dữ liệu.

+0

sử dụng tính năng SQLTransaction để chèn dữ liệu vào bảng – Kalpesh

+0

Chỉ 1GB cho đồng bộ hóa ban đầu hoặc lặp lại? –

+3

Nếu một loạt các hồ sơ, giao dịch có thể giúp đỡ. Nếu bạn có các đốm màu lớn, SQLite không phù hợp với điều đó. Hãy cho chúng tôi biết thêm về dữ liệu, có lẽ chia sẻ một số mã nguồn. BTW, nó tấn công tôi rằng yếu tố hạn chế sẽ là lấy nó từ máy chủ, chứ không phải là tiết kiệm nó trên thiết bị của bạn. – Rob

Trả lời

4

tôi sẽ đề nghị bạn đọc câu hỏi Stack Overflow:

How do I improve the performance of SQLite?

Đó là một cái nhìn rất thourough tại làm thế nào để cải thiện hiệu suất của SQLite nói chung, và nó đã rất hữu ích khi tôi chạm vấn đề tốc độ cố gắng chèn 100.000 bản ghi vào cơ sở dữ liệu SQLite trên iOS.

Cụ thể, việc sử dụng Giao dịch giảm đáng kể tốc độ chèn tổng thể. Đây là một khối mã ngắn mẫu để bạn có thể thấy những gì tôi có nghĩa là:

const char *dbpath = [[Utilities pathInDocumentsFolder: MY_DATABASE] UTF8String]; 
const char *sql = "INSERT INTO Filters (Region, District, Territory) " \ 
    "VALUES (?, ?, ?)"; 
sqlite3 *mapDB; 
char *sqliteError; 

sqlite3_stmt *insertStatement; 

sqlite3_open(dbpath, &mapDB); 

sqlite3_exec(mapDB, "BEGIN TRANSACTION", NULL, NULL, &sqliteError); 

if (sqlite3_prepare_v2(mapDB, sql, -1, &insertStatement, NULL) == SQLITE_OK) { 
    for (NSArray *row in filtersArray) { 
     sqlite3_bind_text(insertStatement, 1, [[row objectAtIndex: 0] UTF8String], -1, SQLITE_TRANSIENT); // Region 
     sqlite3_bind_text(insertStatement, 2, [[row objectAtIndex: 1] UTF8String], -1, SQLITE_TRANSIENT); // District 
     sqlite3_bind_text(insertStatement, 3, [[row objectAtIndex: 2] UTF8String], -1, SQLITE_TRANSIENT); // Territory 

     if (sqlite3_step(insertStatement) != SQLITE_DONE) { 
      break; 
     } 

     sqlite3_clear_bindings(insertStatement); 
     sqlite3_reset(insertStatement); 
    } 
} 

sqlite3_exec(mapDB, "END TRANSACTION", NULL, NULL, &sqliteError); 

sqlite3_finalize(insertStatement); 

Các sqlite3_exec với những điều khoản BEGINEND TRANSACTION là sự kỳ diệu.

+0

+1 Đã đồng ý. Khi chèn nhiều bản ghi, việc sử dụng các giao dịch sẽ cải thiện hiệu suất theo một số đơn đặt hàng có độ lớn. Việc ràng buộc lại cũng giúp, nhưng hiệu suất đạt được là khiêm tốn hơn. – Rob

+1

Tôi cũng có thể đề nghị đăng nhập 'sqlite3_errmsg (mapDB)' nếu bạn không nhận được 'SQLITE_OK' làm mã trả về từ các hàm gọi hàm' sqlite3' khác nhau (hoặc cho 'sqlite3_step', mã trả về' SQLITE_DONE'). – Rob

+1

Và, BTW, bạn có thêm một '?' Giữ chỗ trong SQL của bạn. Nó chỉ là một ví dụ, vì vậy nó không phải là một vấn đề lớn, nhưng chỉ là FYI. Bạn cũng không cần "\" để thực hiện chuỗi trên dòng mã tiếp theo. Bạn chỉ cần dấu gạch chéo ngược nếu bạn không có dấu ngoặc kép đóng ở cuối dòng đầu tiên và dấu ngoặc kép mở mới ở đầu tiếp theo. Cách bạn có nó, dấu gạch chéo ngược là không cần thiết. – Rob

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