Làm cách nào để thêm Cột mới vào Cơ sở dữ liệu SQLite của Android?


82

Tôi có một vấn đề với SQLitecơ sở dữ liệu Android .

Tôi có một bảng chứa một trường.StudentFname và ứng dụng đó đang hoạt động tốt với Android 2.3.1 và bây giờ nếu tôi thêm một trường khác thì ứng dụng của tôi không hoạt động bình thường.

Bất cứ ai có thể giúp tôi những người biết cơ sở dữ liệu rất tốt,

Câu trả lời:


188

bạn có thể sử dụng ALTER TABLEhàm trên onUpgrade()phương pháp của mình , như sau:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // If you need to add a column
  if (newVersion > oldVersion) {
     db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
  }
}

Rõ ràng, SQLite sẽ khác nhau tùy thuộc vào định nghĩa cột.


1
Chào! Tôi đã thử điều này, tôi đã sử dụng phương pháp nâng cấp và bên trong đó tôi cũng đã đặt truy vấn bảng thay đổi. nhưng tôi vẫn không thể thêm cột mới vào cơ sở dữ liệu..nhưng khi tôi viết truy vấn để thêm cột mới và đổi tên cả cơ sở dữ liệu và tên bảng ngoài tôi có thể thêm cột mới..nhưng với sự trợ giúp của phương pháp bảng thay đổi, tôi không thể làm như vậy..đổi tên cơ sở dữ liệu và bảng không phải là tác vụ mong muốn..nó phải làm việc với thay đổi table..vẫn tôi không thể làm điều đó với phương thức bảng thay đổi ..
Aamirkhan

@NagarjunaReddy xin lỗi vì đã trả lời muộn. bạn có thể sử dụng phương pháp này db.execSQL ("CẬP NHẬT bảng SET key = key + 1 WHERE name =?", new String [] {name});
DevYudh 19/09/13

3
Đừng quên tăng phiên bản Cơ sở dữ liệu, nếu không onUpgrade () sẽ không được gọi. Tăng số phiên bản trong mã bên dưới, mã này sẽ có trong hàm tạo của lớp mở rộng lớp SQLiteOpenHelper. siêu (Bối cảnh ngữ cảnh, Tên chuỗi, Nhà máy CursorFactory, int newVersion)
appdroid

Ứng dụng bị đóng băng và tôi có nhiều thông báo như thế này trên nhật ký mèo: Nhóm kết nối cho cơ sở dữ liệu '+ dữ liệu + người dùng + 0 + com ..._ db' đã không thể cấp kết nối đến luồng 1 (chính) với cờ 0x5 cho. Tại sao điều này xảy ra?
Mahdi

29

Tôi đã xem qua chủ đề này khi cần trợ giúp trên ứng dụng của riêng mình, nhưng đã gặp vấn đề với nhiều câu trả lời. Tôi khuyên bạn nên làm như sau:

private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;";

private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;";

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
         db.execSQL(DATABASE_ALTER_TEAM_1);
    }
    if (oldVersion < 3) {
         db.execSQL(DATABASE_ALTER_TEAM_2);
    }
}

Bạn muốn đảm bảo mã sẽ hoạt động khi người dùng nâng cấp nhiều hơn 1 phiên bản và câu lệnh cập nhật chỉ chạy một bản nâng cấp cần thiết. Để biết thêm một chút về điều này, hãy xem blog này .


phải làm gì nếu chúng ta muốn tạo cột đã thay đổi với giá trị Chuỗi mặc định ??
shridutt kothari

22

Cách dễ nhất để làm điều này là thêm một số SQL to the onUpgrade()phương thức trong của bạn SQLiteOpenHelper class. Cái gì đó như:

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

    // If you need to add a new column
    if (newVersion > oldVersion) {
        db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0");
    }
}

Tôi đã thử điều này nhưng vẫn không thể thêm cột mới bằng cách sử dụng phương pháp bảng thay đổi trong phương pháp nâng cấp.
Aamirkhan

Chào! Tôi đã thử điều này, tôi đã sử dụng trên phương pháp nâng cấp và bên trong đó tôi cũng đã đặt truy vấn bảng thay đổi. nhưng tôi vẫn không thể thêm cột mới vào cơ sở dữ liệu..nhưng khi tôi viết truy vấn để thêm cột mới và đổi tên cả cơ sở dữ liệu và tên bảng ngoài tôi có thể thêm cột mới..nhưng với sự trợ giúp của phương pháp bảng thay đổi, tôi không thể làm như vậy..đổi tên cơ sở dữ liệu và bảng không phải là tác vụ mong muốn..nó phải làm việc với thay đổi table..still tôi không thể làm điều đó với phương pháp thay đổi bảng
Aamir Khan

@ user370305 tôi có nên thêm cột mới trong câu lệnh tạo tablle cho người dùng mới cài đặt ứng dụng lần đầu tiên không?
Ahesanali Suthar

15

Có lẽ một cách tiếp cận thanh lịch hơn một chút bằng cách sử dụng switch thay vì if / then sẽ nâng cấp từ bất kỳ lược đồ nào lên lược đồ gần đây nhất ...

Đây cũng là một trang phù hợp về cú pháp để thay đổi bảng: http://alvinalexander.com/android/sqlite-alter-table-syntax-examples

public static final String TABLE_TEAM = "team";
public static final String COLUMN_COACH = "coach";
public static final String COLUMN_STADIUM = "stadium";


private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;";

private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;";


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

    switch (oldVersion)
    {
        case 1:
            //upgrade from version 1 to 2
            db.execSQL(DATABASE_ALTER_TEAM_TO_V2);
        case 2:
            //upgrade from version 2 to 3
            db.execSQL(DATABASE_ALTER_TEAM_TO_V3);

        //and so on.. do not add breaks so that switch will
        //start at oldVersion, and run straight through to the latest

    }

}

Đây là cách để xử lý nhiều lần nâng cấp. Kiểm tra phiên bản đến từ!
Ricardo

Nếu bạn đi từ phiên bản 1 đến 3 trực tiếp (nếu ai đó không tự động cập nhật các ứng dụng), bạn sẽ không đạt được trường hợp 2.
TyMarc

@ TyMarc-- Có, nó sẽ nâng cấp lên phiên bản 2 rồi 3. Công tắc sử dụng phiên bản cũ. Vì vậy, trong ví dụ của bạn, phiên bản cũ là 1. Sau đó, mã sẽ chạy trường hợp 1, nâng cấp từ phiên bản 1 lên 2 và sau đó sẽ chạy trường hợp 2 (vì không có ngắt;), sẽ nâng cấp từ 2 lên 3. Tất cả đều đúng ở đó trong mô tả.
Edward Bagby

4

Tôi đã thực hiện cách tiếp cận sau, nó được cộng hưởng cho tôi

nếu phiên bản DB: 6

Ex : There is a table with 5 columns

Khi bạn nâng cấp lên: 7 (Tôi đang thêm 1 cột mới trong 3 bảng)

 1. We need to add the columns when creating a table

 2. onUpgrade method:

 if (oldVersion < 7) 
 { 
    db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
    db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
    db.execSQL(DATABASE_ALTER_PAPER_LABEL); 
 }

Trong đó: "DATABASE_ALTER_ADD_PAPER_PAID" là truy vấn.

EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
                + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";

Sau hai thao tác trên, nó sẽ hoạt động tốt cho người dùng cài đặt mới và người dùng nâng cấp ứng dụng


3

@ Aamirkhan.i nghĩ rằng bạn đã giải quyết được vấn đề mà bạn đã đề cập trong các bình luận từ lâu. Tôi nghĩ rằng bạn đã không tăng phiên bản cơ sở dữ liệu. hoặc nếu không, câu trả lời ở đây là thẳng thắn. Tôi viết điều này vì nó có thể giúp ích cho những ai chưa tăng hoặc thay đổi số phiên bản cơ sở dữ liệu của họ khi họ đang thay đổi bảng.


vâng, thay đổi tên cơ sở dữ liệu và unistalling ứng dụng và cài đặt lại nó một lần nữa sẽ giải quyết vấn đề
Aamir Khan

@Aamirkhan, vui lòng chuyển séc sang câu trả lời tiếp theo để công chúng có giải pháp rõ ràng hơn.
AlleyOOP

3

Tôi nghĩ chúng ta không nên kiểm tra tình trạng như vậy

 if (newVersion > oldVersion) {
 }

bởi vì nếu chúng ta sử dụng điều này, có nghĩa là mỗi khi chúng ta tăng phiên bản cơ sở dữ liệu thì onUpdrade () sẽ gọi và điều kiện sẽ là true, vì vậy chúng ta nên kiểm tra như vậy

if(oldVersion==1) 
{

}

vì vậy trong trường hợp này nếu phiên bản cũ là 2 thì điều kiện sẽ là false và người dùng với phiên bản cũ 2 sẽ không cập nhật cơ sở dữ liệu (người dùng chỉ muốn cập nhật cho phiên bản 1), vì đối với những người dùng đó thì cơ sở dữ liệu đã được cập nhật.


1

Để thêm cột mới vào bảng bạn cần sử dụng ALTER. Trong android, bạn có thể thêm cột mới bên trong onUpgrade().

Bạn có thể tự hỏi, làm thế nào onUpgrade()sẽ thêm cột mới?

Khi bạn triển khai một lớp con của SQLiteOpenHelper, bạn cần gọi hàm tạo lớp cha: super(context, DB_NAME, null, 1);trong hàm tạo lớp của bạn. Ở đó tôi đã vượt qua 1phiên bản.

Khi tôi thay đổi phiên bản 1trên ( 2hoặc cao hơn), onUpgrade()sẽ được gọi. Và thực hiện các sửa đổi SQL mà tôi dự định làm. Hàm tạo lớp của tôi sau khi thay đổi phiên bản:

public DatabaseHelper(Context context) {
    super(context, DB_NAME, null, 2);//version changed from 1 to 2
}

Các sửa đổi SQL sẽ kiểm tra như thế này, hàm tạo lớp siêu so sánh phiên bản của tệp db SQLite được lưu trữ với phiên bản mà tôi đã chuyển đến super(). Nếu các số phiên bản này (trước đây và bây giờ) khác nhau onUpgrade()sẽ được gọi.

Mã sẽ như thế này:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // add new columns to migrate to version 2
    if (oldVersion < 2) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)");
    }
    // add new columns to migrate to version 3
    if (oldVersion < 3) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER");
    }
}

1

Chỉ cần thay đổi mã của bạn

private cuối cùng int DATABASE_VERSION = 1;

đến

private static final int DATABASE_VERSION = 2;


0

Tôi đã tìm thấy liên kết trong khi tìm kiếm cùng một vấn đề. Nó giải thích cách sử dụng nâng cấp. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

nó giải thích lý do tại sao phải sử dụng mã bên dưới này

 @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < 2) {
             db.execSQL(DATABASE_ALTER_TEAM_1);
        }
        if (oldVersion < 3) {
             db.execSQL(DATABASE_ALTER_TEAM_2);
        }
    }

0

Cách dễ nhất để tạo một cột mới trên bảng là thêm một số SQL vào phương thức onUpgrade () trong lớp SQLiteOpenHelper. Giống:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    switch (oldVersion) {
        case 1:
            db.execSQL(SQL_MY_TABLE);

        case 2:
            db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT");
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.