2017-06-28 20 views
6

Tôi có một tình huống mà tôi muốn có thể thực hiện việc thiết lập lại cơ sở dữ liệu cứng bằng cách sử dụng Android Room. Sử dụng SQLiteOpenHelper, tôi có thể làm điều này bằng cách viết một phương thức để thả tất cả các bảng và chỉ mục, sau đó gọi thủ công SQLiteOpenHelper.onCreate().Làm cách nào để tôi tạo lại hoàn toàn cơ sở dữ liệu của mình trong Android Room?

Tôi biết rằng tôi có thể truy cập vào một số SupportSQLiteOpenHelper qua phòng và tự thả tất cả các bảng, nhưng dường như không có cách nào tốt để bắt đầu quá trình giải trí.

Ngoài ra, tôi biết rằng tôi có thể xóa mọi mục khỏi mỗi bảng mà không làm rơi nó, nhưng đó không phải là những gì tôi muốn. Điều đó không đặt lại khóa chính tăng tự động, do đó, trường "id" của các mục mới sẽ không được đặt lại về 1.

Cảm ơn!

EDIT:
Đây là điều tôi muốn có thể thực hiện tùy ý khi chạy.

CHỈNH SỬA 2:
Phương pháp nên được duy trì, tức là không liên quan đến SQL viết tay khớp với hành vi của Phòng. Lý tưởng nhất là sẽ có một số cách để truy xuất SQL mà Phòng tạo hoặc phương thức tương đương SQLiteOpenHelper.onCreate(). Hoặc bất cứ điều gì khác mà giải quyết vấn đề này! :)

+0

Đây là yêu cầu tính năng, không phải là vấn đề mà ai đó có thể giải quyết ngay bây giờ ngoại trừ Nhà phát triển phòng. Tôi cũng cần tính năng này! –

Trả lời

1

Câu trả lời đơn giản là tăng số phiên bản @Database của bạn. Nói chung bạn nên làm điều này để thay đổi lược đồ, tuy nhiên nó sẽ đạt được mục tiêu của bạn về việc xóa cơ sở dữ liệu và đặt lại tất cả các giá trị khóa chính.

@Database(entities = { Hello.class }}, version = 1) // <- you want to increase version by 1 
@TypeConverters({}) 
public abstract class AppDatabase extends RoomDatabase { 
    public abstract HelloDao helloTextDao(); 
} 

EDIT: NẾU bạn muốn làm điều này vào thời gian chạy, tôi sẽ xóa tất cả các dữ liệu từ các bảng của bạn (để tránh các vấn đề FK), sau đó gọi DROP TABLE table_name, trên tất cả các bảng tương ứng của bạn. Sau đó, bạn sẽ cần phải viết các truy vấn để tạo các bảng tức là: CREATE TABLE table_name (uid INTEGER PRIMARY KEY, name STRING);.

Điều này có nghĩa là bạn phải duy trì danh sách tạo truy vấn bảng được cập nhật với điểm đáng tiếc của POJO. Lý tưởng nhất là bạn có thể sử dụng phản chiếu để tạo truy vấn, howerever @ColumnInfo hiện không hỗ trợ phản chiếu vì nó có RetentionPolicy được đặt thành CLASS.

Hy vọng điều này giải quyết được vấn đề của bạn, vui lòng yêu cầu làm rõ thêm trong các nhận xét. Đi săn vui nhé!

+2

Có, tôi tin rằng điều này sẽ hoàn thành nhiệm vụ giữa các bản cập nhật ứng dụng. Tuy nhiên, tôi muốn có thể làm điều này tùy ý trong thời gian chạy (mà tôi đã có thể làm bằng cách sử dụng phương pháp 'cũ' mà tôi mô tả về việc bỏ tất cả các bảng và gọi onCreate()). Tôi đã cập nhật câu hỏi của mình để phản ánh điều này. – GreysonP

+0

Hy vọng câu trả lời cập nhật của tôi sẽ khắc phục được sự cố. –

+0

Xin chào, tôi hiểu rằng đây là một giải pháp khả thi. Thật không may, tôi không coi nó là một chấp nhận được. Viết SQL bằng tay để tạo lại những gì Room auto-generated cho bạn là một công thức cho thảm họa. Sự khác biệt nhỏ có thể tạo ra những lỗi khủng khiếp. Sử dụng phương thức "cũ", tôi có thể đảm bảo rằng việc gọi onCreate() sẽ tạo lại các bảng chính xác như chúng. Tôi không thể đảm bảo rằng ở đây. Tôi đoán tôi đã hy vọng rằng chúng tôi bằng cách nào đó có thể truy cập vào phương thức onCreate() tương đương của Phòng, hoặc một số phương pháp khó thiết lập lại khác? – GreysonP

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