重复的列名称 lock_status

Duplicate Column Name lock_status

我在数据库和 onUpgrade() 中添加了 lock_status 列 Alter Table,但是当我尝试打开我的应用程序时,它强制停止并出现以下错误。 我应该在 onUpgrade() 中做什么,我已经第四次用新列更新了我的数据库。 非常感谢帮助。

 Caused by: android.database.sqlite.SQLiteException: duplicate column name: lock_status (code 1): , while compiling: ALTER TABLE notes ADD COLUMN lock_status INT
  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
  at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
  at com.revodroid.notes.notes.Adapter.DatabaseHelper.onUpgrade(DatabaseHelper.java:89)
  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
  at com.revodroid.notes.notes.Adapter.DatabaseHelper.getAllNotes(DatabaseHelper.java:170)
  at com.revodroid.notes.notes.Activity.MainActivity.setupNotesAdapter(MainActivity.java:603)
  at com.revodroid.notes.notes.Activity.MainActivity.onCreate(MainActivity.java:256)
  at android.app.Activity.performCreate(Activity.java:6251)

我的数据库代码:

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String LOG=DatabaseHelper.class.getSimpleName();
private static final int DATABASE_VERSION=4;
public static final String DATABASE_NAME="NotesDB";
public SQLiteDatabase database;

private final Context context;

DatabaseHelper databaseHelper;

public static final String TABLE_NOTES="notes";
public static final String TABLE_PASSCODE = "passcodetable";

public static final String KEY_ID="id";
public static final String KEY_TITLE="title";
public static final String KEY_CONTENT="content";
public static final String KEY_UPDATED_AT="updated_at";
public static final String KEY_COLOR="color";
public static final String KEY_TAG="tag";
public static final String KEY_FAVOURITE="favourite";

public static final String KEY_LOCKSTATUS = "lock_status";
public static final String KEY_PASSCODE_ID="passcode_id";
public static final String KEY_PASSOCDE = "passcode";
public static final String KEY_PASSCODE_STATUS = "passcode_status";


private static final String CREATE_TABLE_NOTE="CREATE TABLE "
        +TABLE_NOTES+"("+KEY_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "
        +KEY_TITLE+" TEXT, "
        +KEY_CONTENT+" TEXT, "
        +KEY_UPDATED_AT+" BIGINT, "
        +KEY_COLOR+" INT, "
        +KEY_FAVOURITE+" INT, "
        +KEY_LOCKSTATUS+" INT"+" )";

private static final String CREATE_TABLE_PASSCODE="CREATE TABLE IF NOT EXISTS "
        +TABLE_PASSCODE+"("+KEY_PASSCODE_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "
        +KEY_PASSOCDE+" TEXT"+" )";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.context = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_NOTE);
    db.execSQL(CREATE_TABLE_PASSCODE);
}

public void onDowngrade(SQLiteDatabase paramSQLiteDatabase, int paramInt1, int paramInt2) {
    onUpgrade(paramSQLiteDatabase, paramInt1, paramInt2);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 3){
        db.execSQL("ALTER TABLE notes ADD COLUMN color INT");
        db.execSQL("ALTER TABLE notes ADD COLUMN favourite INT");
    }
    if (newVersion > oldVersion){
        db.execSQL("ALTER TABLE notes ADD COLUMN lock_status INT");
        db.execSQL("CREATE TABLE IF NOT EXISTS "
                +TABLE_PASSCODE+"("+KEY_PASSCODE_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "
                +KEY_PASSOCDE+" TEXT"+" )");
    }
}

您现在编写的代码将尝试在每次 数据库版本增加时添加列lock_status 。您有一个 if 语句检查旧版本 < 3,然后立即对新版本大于旧版本进行第二次检查。当您的版本增加时,第二个检查将始终为真,因此它将始终尝试添加该列。

假设您在版本 4 中添加了 lock_status 列。那么正确的测试将是

if (oldVersion < 4) {
    // your code goes here
}

问题不是(必然)您在创建和升级中添加 lock_status,如评论中所建议的那样。如果数据库已经存在,则不会调用 create 方法。如果数据库还不存在,则不会调用update方法。