2017-06-22 18 views
7

Trong SQLiteOpenHelper có một phương pháp onCreate(SQLiteDatabase ...) mà tôi đã sử dụng để điền các bảng cơ sở dữ liệu với một số dữ liệu ban đầu.Cách điền bảng cơ sở dữ liệu Android Room vào lần chạy đầu tiên?

Có cách nào để chèn một số dữ liệu vào bảng cơ sở dữ liệu Phòng trên ứng dụng đầu tiên không?

+0

Bạn có thể cung cấp một cơ sở dữ liệu được phổ biến trước. Và làm việc trên cái đó. –

Trả lời

-3

Giải pháp sẽ là triển khai "SharedPreferences", gói được đưa vào Android.

Các mã sau đây được dựa trên giải pháp từ: Check if application is on its first run

public class MyActivity extends Activity { 

    SharedPreferences prefs = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     prefs = getSharedPreferences("com.mycompany.myAppName", MODE_PRIVATE); 
     ... 
    } 

    @Override 
    protected void onResume() { 
     ... 
     if (prefs.getBoolean("firstrun", true)) { 
      // !DO YOUR DATABASE INSERT/POPULATION HERE! 
      prefs.edit().putBoolean("firstrun", false).commit(); 
     } 
     ... 
    } 
} 
+1

Nhưng giải pháp tốt hơn là điền dữ liệu ngay sau khi tạo cơ sở dữ liệu thay vì thêm cờ này. Vì vậy, tôi mong muốn gắn dấu sao yêu cầu tính năng này https://issuetracker.google.com/issues/62699324 – Sinigami

5

Tôi đã thử một số cách để làm điều này, mỗi không có sẵn.

Trước tiên, tôi đã thử thêm triển khai Di chuyển vào Phòng bằng phương pháp 'addMigrations', nhưng thấy rằng nó chỉ chạy trong khi nâng cấp cơ sở dữ liệu, nhưng không phải khi tạo.

Sau đó, tôi đã thử chuyển qua triển khai SQLiteOpenHelper cho Phòng bằng phương thức 'openHelperFactory'. Nhưng sau khi tạo ra một loạt các lớp học để có được các công cụ sửa đổi truy cập cấp gói của Room, tôi đã từ bỏ nỗ lực này. Tôi cũng đã thử subclassing FrameworkSQLiteOpenHelperFactory của lớp nhưng một lần nữa, trình sửa đổi truy cập cấp gói của constructor của nó không hỗ trợ điều này.

Cuối cùng, tôi đã tạo một IntentService để điền dữ liệu và gọi nó từ phương thức onCreate của lớp con Ứng dụng của tôi. Cách tiếp cận này hoạt động nhưng một giải pháp tốt hơn nên là bản sửa lỗi sắp tới cho vấn đề theo dõi được đề cập bởi Sinigami ở nơi khác trên trang này.

Darryl

[Added 19 tháng 7 năm 2017]

Vấn đề này trông như thể nó giải quyết trong Phòng 1.0.0. Alpha 5. Phiên bản này đã thêm một cuộc gọi lại vào RoomDatabase cho phép bạn thực thi mã khi cơ sở dữ liệu được tạo lần đầu tiên. Hãy xem tại địa chỉ:

https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.Callback.html

17

Bạn có thể chạy các kịch bản sau khi cơ sở dữ liệu được tạo ra hoặc chạy mỗi khi cơ sở dữ liệu được mở ra sử dụng RoomDatabase.Callback, lớp này có sẵn trong phiên bản mới nhất của thư viện Phòng.

Bạn cần triển khai phương thức onCreate và onOpen của RoomDatabase.Callback và thêm nó vào RoomDatabase.Builder như được hiển thị bên dưới.

yourDatabase = Room.databaseBuilder(context, 
          YourDatabase.class, "your db").addCallback(rdc).build(); 



    RoomDatabase.Callback rdc = new RoomDatabase.Callback(){ 
     public void onCreate (SupportSQLiteDatabase db){ 
     // do something after database has been created 
     } 
     public void onOpen (SupportSQLiteDatabase db){ 
     //do something every time database is open 
     } 
    }; 

tham khảo: https://medium.com/@srinuraop/database-create-and-open-callbacks-in-room-7ca98c3286ab

+0

Câu hỏi này sẽ được gắn cờ là câu trả lời chính xác. Cảm ơn! – Imanol

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