2012-01-20 25 views
14

Trước hết tôi đã thực hiện một tìm kiếm và không thể tìm thấy một câu trả lời cụ thể cho câu hỏi của tôi vì vậy ở đây đi ...Giữ cơ sở dữ liệu SQLite cùng khi nâng cấp và ứng dụng Android từ Lite để Pro phiên bản

Tôi viết ứng dụng Android đầu tiên của tôi và có kế hoạch có phiên bản Lite (các tính năng hạn chế) và phiên bản trả tiền (tính năng đầy đủ).

Phiên bản Lite và Pro sẽ sử dụng cấu trúc cơ sở dữ liệu SQLite giống nhau và nếu người dùng bắt đầu với phiên bản Lite và nâng cấp lên phiên bản Pro, tôi không muốn họ mất dữ liệu mà họ đã tạo trong phiên bản Lite.

Vì phiên bản Lite và Pro (theo hiểu biết của tôi) phải nằm trong các gói riêng biệt để cho phép Android Market phân biệt giữa chúng, phiên bản Pro có thể xem cơ sở dữ liệu Lite như thế nào?

Rất cám ơn trước vì câu trả lời của bạn.

+0

này dường như là một bản sao của http://stackoverflow.com/questions/7053809/share-sqlite-database -giữa-2-android-ứng dụng, nơi có một câu trả lời (thứ hai xuống). –

+1

@EdJellard Tôi không tin đó là một bản sao.Trong khi các câu hỏi là _similar_, chúng khác nhau. Câu hỏi đó là hỏi về việc chia sẻ DB giữa hai ứng dụng, không nhất thiết phải là hai phiên bản của ứng dụng _same_. –

+0

Cảm ơn bạn tôi sẽ xem xét. –

Trả lời

12

Những gì tôi đã làm và dường như hoạt động cho Hexaddicus, có cả phiên bản Lite và Pro chạy với cùng một người dùng và sau đó chạy lần đầu tiên của phiên bản Pro, sao chép cơ sở dữ liệu Lite. Sau đó thông báo cho người dùng bản sao.

Đặt android:sharedUserId là như nhau trong cả hai sản phẩm ...

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.mycompany.package" 
     android:sharedUserId="com.mycompany.package" <---- IMPORTANT 
     android:versionCode="10" 
     android:versionName="@string/app_version" 
     android:installLocation="auto"> 

Và sau đó mã để sao chép các DB ...

try { 
     final Context free_context = this.createPackageContext("com.mycompany.package", Context.CONTEXT_INCLUDE_CODE); 
     final File full_db  = this.getDatabasePath(GameData.DATABASE_NAME); 
     final File full_db_dir = full_db.getParentFile(); 
     final File free_db  = free_context.getDatabasePath(GameData.DATABASE_NAME); 
     final File free_db_dir = free_db.getParentFile(); 

     if (free_db.exists() == false)  return; 
     if (full_db_dir.exists() == false) full_db_dir.mkdir(); 
     if (full_db.exists() == false)  full_db.createNewFile(); 

     FileUtils.copyDirectory(free_db_dir, full_db_dir); 
     this.gameData.getWritableDatabase(); 
    } 
    catch (NameNotFoundException e) { 
     /* do nothing here since this is an semi expected case */ 
     Log.w("mytag", "No Lite version found"); 
    } catch (IOException e) { 
     Log.w("mytag", "Failed to create file"); 
    } 
} 

Nhược điểm duy nhất của việc này là một lần bản sao được thực hiện, không có đồng bộ hóa giữa hai phiên bản. Bạn cũng phải đảm bảo rằng người dùng phiên bản Lite đang chạy phiên bản đang chạy dưới dạng sharedUserId hoặc bản sao sẽ không thành công.

Cập nhật: hãy xem xét ChrisCashwells nhận xét và câu trả lời quá kể từ khi anh ấy đưa ra một điểm hợp lệ và tôi không thể nhớ những gì tôi đã làm trong ví dụ của anh ấy.

+0

Tôi chỉ muốn đề xuất cùng một giải pháp. Chỉ cần thêm vào câu trả lời này, bạn nên xem thông số android: sharedUserId trong tệp kê khai. – Yury

+0

Điều này đòi hỏi phải có một 'sharedUserId', nhưng có thể là một giải pháp khả thi. Nếu bạn chưa có tập hợp 'sharedUserId', gửi một bản cập nhật * có * có một tập hợp có nghĩa là vô hiệu hóa quyền truy cập của ứng dụng vào cùng một DB. –

+0

@ChrisCashwell: Bạn có chắc chắn 100% về điều đó không? Tôi có vẻ nhớ vấn đề đó nhưng tôi nghĩ rằng tôi đã làm việc xung quanh nó. Hoặc là HOẶC tôi nghĩ về điều đó ngay từ đầu. Cập nhật câu trả lời của tôi. –

2

Bạn có thể muốn thực hiện thêm phương pháp "mở khóa" so với ứng dụng phải trả tiền riêng nếu có thể. Bằng cách đó bạn chỉ sử dụng một gói. Nếu không vì lý do nào khác, bạn sẽ tránh được vấn đề quyền sở hữu cơ sở dữ liệu.

Sử dụng cùng một android:sharedUserId sẽ là cách tiếp cận tốt nếu ứng dụng của bạn đã có một bộ. Nếu không, bạn sẽ vô hiệu hóa quyền truy cập vào tất cả dữ liệu của người dùng nếu bạn gửi một bản cập nhật có một bộ. Nếu bạn đang bắt đầu từ số không vuông và chưa có ứng dụng tự nhiên với người dùng muốn giữ dữ liệu của họ, hãy đặt số sharedUserId từ ngày đầu tiên.

+0

Có một ứng dụng đơn lẻ là một lựa chọn mong muốn, bởi vì nó giữ mọi thứ đơn giản. Ứng dụng của tôi vẫn đang được phát triển nên hiện tại tôi đang mở cho các ý tưởng ... thức ăn cho ý nghĩ! –

+0

@GuardianAngel điều này cũng giúp quản lý dễ dàng hơn sau này. Ví dụ, bạn tìm thấy một lỗi, bạn có muốn sửa chữa nó trong hai ứng dụng riêng biệt (miễn phí và trả tiền) hoặc chỉ một? –

1

Như @ Chris nói rằng bạn có thể sử dụng "mở khóa" phương pháp tiếp cận, tôi sẽ giải thích nó như thế nào tôi làm trong điều kiện như vậy.

Bạn có thể có bảng như 'Tính năng' phải có cột/cờ IsAvailable. Nếu bạn muốn hạn chế một số tính năng nhất định, bạn có thể đặt cờ IsAvailable thành FALSE.

Nếu bạn có những thay đổi trong cấu trúc DB, sau đó bạn nên nâng cấp lên DB sử dụng:

@Override 
public void onUpgrade() 
{ 
    if (condition == true) 
    // alter table 
} 
Các vấn đề liên quan