2012-04-13 22 views
5

Tôi đã tải lên ứng dụng trên cửa hàng ứng dụng (phiên bản 1.0). Ứng dụng của tôi đang sử dụng cơ sở dữ liệu sqlite để lưu trữ một số dữ liệu. Bây giờ, tôi đã thực hiện một số thay đổi trong cơ sở dữ liệu (tôi đã thêm 2 hoặc 3 cột mới vào một trong các bảng trong db của tôi). Tôi muốn cập nhật phiên bản trước của ứng dụng của mình bằng phiên bản 1.1 mới (có cấu trúc db khác). Bây giờ, khi người dùng đã sử dụng phiên bản 1.0 nâng cấp ứng dụng lên phiên bản 1.1, thì db đã có trong hộp cát ứng dụng và do đó, ứng dụng đang trỏ tới phiên bản 1.1, nhưng db của tôi vẫn là phiên bản cũ. Tôi muốn có db mới với dữ liệu cũ, nếu có. Hãy giúp tôi ra. Cảm ơn.Cập nhật phiên bản mới cho cửa hàng ứng dụng với cấu trúc db sqlite khác nhau

+0

Kiểm tra câu trả lời của tôi ở đây: http://stackoverflow.com/a/9851554/108574 để có chiến lược nâng cấp cơ sở dữ liệu. –

+0

@HeShiming Cảm ơn bạn. Nhưng tôi đã tải lên phiên bản 1.0 trên cửa hàng ứng dụng và nó không có bảng siêu dữ liệu (để lưu trữ phiên bản cơ sở dữ liệu, như bạn đã đề xuất). Bây giờ, tôi muốn tải lên một phiên bản mới và có một sự thay đổi trong cấu trúc db. Vì vậy, làm thế nào tôi có thể đạt được nó ngay bây giờ? – anshul

+0

thì phương pháp vẫn hợp lệ. Bạn chỉ cần kiểm tra sự tồn tại của bảng siêu dữ liệu bằng cách kiểm tra giá trị trả lại của câu lệnh chọn. Sau đó, nếu nó không tồn tại, tạo một. –

Trả lời

12

sqlite hỗ trợ điều gì đó được gọi là thuộc tính user_version, bạn có thể thực thi PRAGMA user_version để truy vấn phiên bản lược đồ hiện tại của db ứng dụng của bạn. Truy vấn này có thể xảy ra khi viết ngay từ đầu khi ứng dụng của bạn bắt đầu.

để cập nhật user_version này thực thi truy vấn cập nhật sau PRAGMA user_version = version_num;

Bất cứ khi nào bạn tạo db sqlite, cách tốt nhất là đặt thuộc tính user_version này, để khi bạn nâng cấp trong tương lai, bạn có thể truy vấn giá trị hiện tại. Kiểm tra xem nó cần gì và thực thi các thay đổi còn lại hoặc tạo các bảng để nâng cấp phiên bản lược đồ của bạn.

Ví dụ:

Trong phiên bản đầu tiên tôi tạo table1 với col1, col2

tôi thực hiện sql để tạo table1 và một khi nó được thực hiện thành công, tôi thực hiện pragma user_version = 1. vì vậy đây sẽ chỉ ra tôi phiên bản giản đồ hiện nay là 1

Trong phiên bản tương lai tôi thêm col3 mới, tôi cần phải thay đổi phiên bản giản đồ của tôi để 2

đầu tiên tôi user_version truy vấn, kiểm tra giá trị của nó và nếu nó là 1, sau đó bạn cần phải chạy thay đổi kịch bản để thêm cột mới và đặt phiên bản người dùng thành 2.

Trong trường hợp của bạn, vì bạn chưa đặt user_version trước đây, sẽ rất khó để phân biệt cài đặt mới so với kịch bản nâng cấp. Vì vậy, bây giờ có thể bạn giả sử nếu db là hiện tại nó là kịch bản nâng cấp và thực thi các kịch bản thay đổi và nếu không có giả định nó là một kịch bản mới cài đặt và chạy tạo tập lệnh. Nhưng hãy xem liệu bạn có thể sử dụng pragma trên để giải quyết vấn đề của mình trong tương lai không.

+0

có vẻ là một cách hay để cập nhật và duy trì lược đồ cơ sở dữ liệu, tôi sẽ cố gắng thử điều này. –

-1

Bạn có thể kiểm tra khi khởi chạy nếu đó là db cũ và nếu có thói quen tạo db mới với cấu trúc mới (với tên tạm thời), sao chép tất cả dữ liệu từ cũ sang mới, đóng db cũ & xóa nó, đóng db mới, đổi tên nó, sau đó cuối cùng mở nó một lần nữa cho ứng dụng cập nhật của bạn để sử dụng. Dễ dàng, nhanh chóng, & bạn không cần kiến ​​thức chuyên sâu về SQLite để làm điều đó.

+0

Nhưng tôi muốn làm điều này chỉ khi người dùng đã nâng cấp từ 1.0 lên 1.1. Cách tiếp cận bạn đang nói sẽ được thực hiện trong phương thức appDidFinishLaunching trong ủy nhiệm ứng dụng và do đó, các dòng mã này sẽ được thực thi mỗi lần tôi khởi chạy ứng dụng của mình. Đúng??? Vì vậy, tôi cần một cái gì đó giống như số phiên bản của cơ sở dữ liệu sqlite. – anshul

+0

Không phải như vậy - bạn chỉ cần kiểm tra xem db có phải là cấu trúc mới hay không – SomaMan

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