2010-03-21 38 views
20

Có cách nào để thực hiện di chuyển giản đồ cơ sở dữ liệu trên Android không? Ví dụ: người dùng cài đặt phiên bản mới hơn của ứng dụng Android của tôi nhưng phiên bản mới cần cập nhật lược đồ cơ sở dữ liệu (và xóa cơ sở dữ liệu của người dùng và bắt đầu lại không phải là một tùy chọn!). Vì vậy, tôi cần phải chạy một số báo cáo ALTER và/hoặc sao chép bảng lần đầu tiên phiên bản mới của tôi chạy.Làm cách nào để di chuyển giản đồ cơ sở dữ liệu trong Android?

+0

Vui lòng giải thích chi tiết hơn về điều gì bạn hiểu trong quá trình di chuyển giản đồ? Di chuyển ở đâu? – Pentium10

Trả lời

10

Có SQLiteOpenHelper có hỗ trợ di chuyển giữa các phiên bản khác nhau của lược đồ DB.

Nâng cấp được thực hiện bằng cách thực hiện

public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) 

Và nhạc Rolling trở lại một phiên bản trước cũng được hỗ trợ:

public abstract void onDowngrade (SQLiteDatabase db, int oldVersion, int newVersion) 
7

Với một chút suy nghĩ, bạn gần như có thể tự động thực hiện rất nhiều các SQLiteOpenHelper phương pháp. Hãy xem bài đăng trên blog này http://www.greenmoonsoftware.com/2012/02/sqlite-schema-migration-in-android/

Cập nhật: Tôi gặp phải một số vấn đề nếu cập nhật cơ sở dữ liệu mất một lúc để hoàn thành. Hãy xem bài viết blog này để biết cách triển khai phù hợp với tôi. http://www.greenmoonsoftware.com/2012/05/android-developer-how-to-safely-update-the-application-database/

0

Tôi biết điều này là cũ nhưng tôi đã phát triển một plugin eclipse nguồn mở là ngôn ngữ cụ thể của miền (DSL được viết bằng XText) cho phép bạn chỉ định cơ sở dữ liệu làm danh sách di chuyển.

Nó tạo ContentProvider, SqliteOpenHelper và hợp đồng cho bạn, vào một API giống như một API như API liên hệ hoặc API truyền thông.

Tôi đã viết một hướng dẫn cơ bản giúp bạn bắt đầu ở đây http://robotoworks.com/mechanoid-plugin/mechanoid-db/

Cho đến nay nó hỗ trợ tạo bảng, tạo xem và thay đổi bảng báo cáo, tôi hy vọng sẽ thực hiện đầy đủ cú pháp Sqlite nơi thích hợp cho DSL này.

Hy vọng rằng sẽ giúp và xin lỗi vì spam! :)

0

Câu trả lời của yanchenko là chính xác, tuy nhiên, bạn có thể muốn xem Droid Migrate, là khung tôi đã sử dụng rộng rãi SQLiteOpenHelper để tạo điều kiện tự động chuyển SQLite (giống như cách Rails thực hiện).

+0

Đến từ một nền đường ray, điều này có vẻ tuyệt vời! Mối quan tâm duy nhất của tôi là nó vẫn tích cực duy trì? Cam kết cuối cùng là khoảng 2 năm trước .. – aandis

1

Tất cả các câu trả lời ở trên liên quan đến SQLiteOpenHelper là chính xác, nhưng tất cả đều chứa một loại mẫu mã - tạo/sửa đổi cấu trúc DB bằng chuỗi. Nó làm cho cả hai phát triển và bảo trì đắt tiền hơn. Đôi khi việc di chuyển bao gồm nhiều phát biểu, một số có thể khá lớn. Viết chúng thành Strings, không có bất kỳ cú pháp nào, ... cho các cấu trúc nhỏ, nó có thể hoạt động, nhưng đối với một số cấu trúc lớn hơn thì nó sẽ là một cơn ác mộng. Một cách tốt hơn để quản lý các thay đổi lược đồ sẽ là giữ cho mỗi tập lệnh di chuyển trong tệp bên ngoài và làm cho phương thức onUpgrade của SQLiteOpenHelper thực thi chúng một cách tự động theo đúng thứ tự. Đây là một bài viết đề cập đến chủ đề này: http://www.vertabelo.com/blog/sqlite-on-android-handling-database-structure-changes. Tôi hi vọng cái này giúp được.

5

Kể từ phiên bản 3.0 Flyway hiện hỗ trợ di chuyển cơ sở dữ liệu trên Android. Nó hoạt động với SQLite, nhưng cũng với bất kỳ cơ sở dữ liệu nào khác mà bạn muốn sử dụng (bộ nhớ trong cục bộ hoặc một DB trên máy chủ cho các ứng dụng hai tầng).

Di chuyển có thể được viết bằng cả SQL và Java.

+0

Tôi thấy nó hơi phức tạp để Flyway tìm thấy những di chuyển trên Android. Di chuyển phải nằm trong thư mục nội dung không được tạo theo mặc định với các dự án Android Studio mới. Ngoài ra, Android sẽ không hỗ trợ Di chuyển (hoặc các nội dung khác) trong tệp Jar. Tôi giải quyết sự cố nếu dự án Jar nằm trong cùng một Dự án Android Studio, là đặt một cái gì đó như thế này trong gradle.build: sourceSets {main {assets.srcDirs = ['../library/src/main/resources/' ]}} –

+0

@JohannesBrodwall Chúng tôi chắc chắn sẽ chào đón một yêu cầu kéo để cải thiện điều này, nếu bạn có một giải pháp tốt hơn mà sẽ làm việc ra khỏi hộp. –

+0

Tôi nghĩ rằng nơi duy nhất mà nó có thể được cải thiện là tài liệu hướng dẫn. Nó hoạt động tốt, nhưng nó đã cho tôi một thời gian để tìm ra. Tôi không thể tìm thấy tài liệu Android tại http://flywaydb.org/documentation/ –

1

Bạn có thể nâng cao mặc định SQLiteOpenHelper bằng thư viện Android-Migrator, cho phép bạn áp dụng di chuyển từ sql tệp trong thư mục android assets.

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