2011-08-16 27 views
6

Tôi hiện đang sử dụng ORMLite để làm việc với cơ sở dữ liệu SQLite trên Android. Là một phần của điều này, tôi đang tải xuống một loạt dữ liệu từ máy chủ phụ trợ và tôi muốn có dữ liệu này được thêm vào cơ sở dữ liệu SQLite ở định dạng chính xác giống như trên máy chủ phụ trợ (tức là các ID giống nhau, v.v.) . Vì vậy, câu hỏi của tôi đối với bạn là nếu tôi điền đối tượng nhập cơ sở dữ liệu của mình (chúng tôi gọi nó là Thiết bị), bao gồm trường khóa CreatedId/primary của thiết bị thông qua setId() và sau đó chạy DAO.create() với rằng thiết bị nhập ID sẽ được lưu chính xác? Tôi đã thử nó theo cách này và có vẻ như với tôi rằng đây không phải là trường hợp. Nếu đó là trường hợp tôi sẽ thử lại và tìm kiếm các vấn đề khác, nhưng với một vài người đầu tiên vượt qua mã tôi đã không thể tìm thấy một. Vì vậy, về cơ bản, nếu tôi gọi DAO.create() trên một đối tượng cơ sở dữ liệu với một bộ ID thì ID đó sẽ được gửi đến cơ sở dữ liệu và nếu nó không được, làm thế nào tôi có thể chèn một hàng với một giá trị khóa chính đã được điền?Hàng Chèn Android/ORMLite có ID

Cảm ơn!

Trả lời

13

@Femi đúng là một đối tượng có thể là id được tạo ra hoặc một id, nhưng không phải là cả hai. Vấn đề là nhiều hơn cách ORMLite lưu trữ đối tượng nhưng nó cũng phải khớp với lược đồ mà cơ sở dữ liệu được tạo ra.

ORMLite hỗ trợ tùy chọn allowGeneratedIdInsert=true để @DatabaseField chú thích cho phép hành vi này. Điều này không được hỗ trợ bởi một số loại cơ sở dữ liệu (ví dụ Derby) nhưng hoạt động trong Android/SQLite.

Đối với hậu thế, bạn cũng có thể tạo 2 đối tượng chia sẻ cùng một bảng - một đối tượng có id được tạo và không có id. Sau đó, bạn có thể chèn bằng cách sử dụng tạo-id Dao để có được hành vi đó và Dao khác để có giá trị id được thiết lập bởi người gọi. Đây là another answer talking about that. Vấn đề cho bạn nghe như thế này sẽ tạo ra rất nhiều DAO bổ sung.

Giải pháp duy nhất khác là không sử dụng id cho mục đích của bạn. Hãy để cơ sở dữ liệu tạo ra id và sau đó có một trường bổ sung mà bạn sử dụng được thiết lập bên ngoài cho các mục đích của bạn. Việc buộc cơ sở dữ liệu-id trong một số trường hợp nhất định dường như với tôi là một mẫu xấu.

4

Từ http://ormlite.com/docs/generated-id:

Boolean cho dù lĩnh vực này là một trường id tự động tạo ra. Mặc định là sai. Chỉ có một trường có thể có bộ này trong một lớp. Điều này cho cơ sở dữ liệu tự động tạo một id tương ứng cho mỗi hàng được chèn vào. Khi một đối tượng với một id được sinh ra được tạo ra bằng cách sử dụng phương thức Dao.create(), cơ sở dữ liệu sẽ tạo một id cho hàng sẽ được trả về và được đặt trong đối tượng bằng phương thức create. Một số cơ sở dữ liệu yêu cầu trình tự cho các id được tạo trong trường hợp tên trình tự sẽ được tạo tự động. Để chỉ định tên của chuỗi sử dụng generatedIdSequence. Chỉ có thể chỉ định một trong số này, id và generatedIdSequence.

Bạn phải sử dụng generatedId (trong trường hợp xuất hiện tất cả id phải được tạo) hoặc id (trong trường hợp này bạn có thể đặt) nhưng không được cả hai.

+0

Tôi đã đọc điều này, nhưng tôi cho rằng tôi cũng có thể nhập ID của riêng mình, bởi vì trong các cơ sở dữ liệu khác tôi có thể INSERT với id ngay cả khi nó có khóa chính được tạo tự động. Đây có phải là một cái gì đó cụ thể để thiết lập của ORMLite, hoặc có thể cơ sở dữ liệu SQLite? –

+0

Nó dành riêng cho ORMLite: xem http://ormlite.svn.sourceforge.net/viewvc/ormlite/ormlite-core/trunk/src/main/java/com/j256/ormlite/stmt/mapped/MappedCreate.java? revision = 1861 & view = markup, dòng 32.Bạn sẽ nhận thấy rằng nó sẽ tự động gán id cho các thiết lập createdId hoặc generatedIdSequence, mà không kiểm tra xem một giá trị đã được thiết lập chưa. Nếu bạn đang sử dụng SQLite, bạn có thể chỉ cần viết vào cơ sở dữ liệu theo cách thủ công, sau đó tải lại bằng ORMLite hoặc thêm một cột riêng cho id cơ sở dữ liệu máy chủ (đó là những gì tôi làm, mặc dù tôi không sử dụng ORMLite). – Femi

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