2012-04-14 48 views
5

Tôi đang có một bảng có cột 'int'. Trong khi nâng cấp phần mềm, tôi muốn thay đổi nó thành kiểu dữ liệu 'dài'. Có vẻ như SQLite không cung cấp một tùy chọn (trong câu lệnh thay đổi) để thay đổi/sửa đổi các thuộc tính cột. Vì tôi muốn nâng cấp, bảng có thể chứa dữ liệu mà người dùng không nên mất. Vì vậy, hãy gợi ý cho tôi một phương pháp tốt để thay đổi thuộc tính kiểu dữ liệu cột mà không mất dữ liệu.Cần một phương pháp tốt để thay đổi (SQLite) kiểu dữ liệu cột

Một cách được đề xuất trong liên kết tìm kiếm là tạo bảng tạm thời, sao chép các bản ghi từ bảng hiện có, xóa bảng hiện có và đổi tên bảng tạm thời. Tôi nghi ngờ đó là hiệu quả.

Trợ giúp của bạn được đánh giá cao!

Trân

Vivek Ragunathan

Trả lời

10

Tôi đã sử dụng các câu lệnh sau để thay đổi loại cột.

CREATE TABLE IF NOT EXISTS **TEMP_TABLE** (id integer primary key autoincrement, **col2change integer not null**, ...) 

INSERT INTO TEMP_TABLE SELECT * FROM EXISTING_TABLE 

DROP TABLE EXISTING_TABLE 

ALTER TABLE TEMP_TABLE RENAME TO EXISTING_TABLE 

Tôi đã thay đổi cột loại int trong bảng hiện tại thành kiểu số nguyên. Đối với một vài trăm hàng, nó đã được hợp lý nhanh chóng.

+0

cách dễ dàng và an toàn nhất – prashantwosti

0

bạn có thể thêm một cột mới, sao chép các giá trị hình thành cũ sang cột mới, xóa các cột cũ và sau đó đổi tên cột mới cho tên cũ

+0

Dường như là một ý tưởng hay nhưng hãy xem một trong các nhận xét ở trên đề cập đến tài liệu SQLite. Nó nói rằng một cột không thể được đổi tên hoặc loại bỏ! –

+0

là nó có thể đổi tên một bảng?sau đó bạn có thể tạo một bảng mới hoàn chỉnh và chuyển dữ liệu –

+0

Đúng vậy. Và đó là câu hỏi của tôi. Điều đó có hiệu quả không? Có phương pháp thay thế nào để đạt được thay đổi kiểu dữ liệu cột không? –

0

AFAIK có không có cách nào trong Android để thay đổi loại dữ liệu cột khi bảng được tạo và sử dụng. Cách thực hành là tạo một bảng mới và sao chép dữ liệu mà bạn đọc về các cột

+0

Tôi đoán đó là sự thật, và tôi đang thử nó! –

3

Các cột SQLite3 không có kiểu dữ liệu, chỉ có affinities - không có lợi ích trong việc thay đổi loại cột từ int thành long.

Nếu chương trình trình bao bọc cắt bớt giá trị trước khi đưa chúng vào SQLite3, có cách khắc phục điều này bằng cách chỉnh sửa lược đồ. Nó là một hoạt động nguy hiểm, do đó, làm điều đó chỉ sau khi sao lưu cơ sở dữ liệu của bạn. Lược đồ được lưu trữ trong bảng sqlite_master; thông thường nó chỉ đọc, nhưng bạn có thể sửa đổi nó nếu bạn bật nó với pragma writable_schema. Hãy cẩn thận để chỉ thực hiện các thay đổi không làm mất hiệu lực dữ liệu của bạn; bạn có thể thay đổi int thành long int vì cả hai đều có mối quan hệ INTEGER.

+1

Nhưng giá trị được giữ trong cột là nhạy cảm với int hoặc dài. Nếu nó không dài, dữ liệu được chèn vào trong cột sẽ bị cắt bớt. –

+0

Trong trường hợp đó, bản thân nó không phải là SQLite3, mà là một API bao bọc (wrapper API) là các giá trị cắt ngắn. Xem phụ lục trả lời của tôi. –

+0

Bạn đang sử dụng getLong? Http: //developer.android.com/reference/android/database/Cursor.html#getLong (int)? –

1

Từ tài liệu SQLite

Không thể đổi tên một cột, loại bỏ một cột, hoặc thêm hoặc loại bỏ những hạn chế từ một bảng.

Check this link

Xin đừng nhớ rằng kiểu dữ liệu cột là không cứng nhắc trong SQLite. Check this link

Edit: Tiếp theo bình luận của bạn về câu trả lời khác, tôi đoán tùy chọn mà bạn cần chú ý - làm việc thông qua các bảng tạm thời - là người duy nhất, mà không phải là hiệu quả giảm giá khóa học.

+0

Liên kết thứ hai không hoạt động! –

+0

Cái xấu của tôi, vừa sửa. – ABH

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