2012-02-05 49 views
6

Tôi đang cố gắng để cập nhật bảng cơ sở dữ liệu của tôi với đoạn mã sau:getWritableDatabase gọi đệ quy

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

     String query = "ALTER TABLE names ADD COLUMN hidden integer default 0"; 
     dbHelper.getWritableDatabase().rawQuery(query, null); 

    } 

Tuy nhiên, khi tôi khởi động ứng dụng và nó cố gắng để nâng cấp cơ sở dữ liệu tôi có được ngoại lệ sau đây:

...Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively 

Có ai biết cách tôi có thể giải quyết vấn đề này và chính xác nguyên nhân gây ra sự cố này không?

Cảm ơn

+0

đây không phải là nơi duy nhất mà đoạn mã này được gọi là nó? – JoxTraex

+0

Có, đây là nơi duy nhất mã được gọi. Tôi đặt một tuyên bố đăng nhập trong chức năng là tốt và nó chỉ được gọi là một lần. – Nick

+0

Sau đó thực hiện kiểm tra nếu phiên bản cũ là JoxTraex

Trả lời

23

Đừng gọi getWritableDatabase(). Sử dụng thông báo được chuyển vào:

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

    String query = "ALTER TABLE names ADD COLUMN hidden integer default 0"; 
    db.rawQuery(query, null); 

} 

Tại sao? Khi bạn gọi getWritableDatabase(), OpenHelper sẽ phát hiện rằng cơ sở dữ liệu cần được cập nhật, do đó nó sẽ khởi động cảnh báo đệ quy bạn đang thấy. Nói cách khác, bạn đang ở trong onUpgrade(). Bạn gọi số getWritableDatabase(), bạn cần nâng cấp. Không phải là séc, bạn sẽ quay lại ngay vào onUpgrade(), quảng cáo vô hạn.

+0

Câu trả lời tuyệt vời, hoàn toàn bỏ lỡ @Brian Dupuis +1 – JoxTraex

+0

Rừng cho cây :). Cảm ơn. –

+0

Hoàn hảo, cảm ơn! – Nick