2016-06-07 22 views
2

Ich habe Spalte lock_status in der Datenbank und in onUpgrade() Alter Table hinzugefügt, aber wenn ich versuche, meine App zu öffnen, wird sie mit dem folgenden Fehler beendet. Was soll ich in onUpgrade() tun, ich habe meine Datenbank 4. mal mit neuer Spalte aktualisiert. Hilfe ist sehr geschätzt.Name der doppelten Spalte lock_status

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) 

Meine Datenbank-Code:

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"+")"); 
    } 
} 
+0

Das Problem ist, dass Sie versuchen, KEY_LOCKSTATUS in CREATE TABLE und in ALTER TABLE zu –

+0

@LucasPaolillo hinzuzufügen Aber wenn Benutzer die App zum ersten Mal installiert, dann wird onCreate() aufrufen, so dass alle Spalten vorhanden sein sollten, Wenn der Benutzer die App aktualisiert, ruft er jedoch upUpgrade() auf. –

Antwort

4

Ihr Code wie jetzt versuchen geschrieben wird die Spalte lock_status alle Zeit, um Ihre Datenbankversion erhöht hinzuzufügen. Sie haben eine if-Anweisung, die auf alte Version < 3 prüft, dann sofort eine zweite Überprüfung auf neue Version größer als alte Version. Diese zweite Überprüfung wird immer wahr, wenn Ihre Version zunimmt, also wird immer versucht, die Spalte hinzuzufügen.

Angenommen, Sie lock_status Spalte in der Version 4. Dann wäre ein richtiger Test

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

Das Problem ist nicht (unbedingt), die Sie lock_status in Ihrer hinzufügen hinzugefügt erstellen und in Ihrem Upgrade, wie in ein vorgeschlagenes Kommentar. Wenn die Datenbank bereits existiert, wird die create-Methode nicht aufgerufen. Wenn die Datenbank noch nicht existiert, wird die Update-Methode nicht aufgerufen.

+0

Ich habe versucht, wenn (alteVersion <4) vorher, es wird nicht funktionieren. –

+0

Wenn Sie im Debugger auf diesen Code zugreifen, was zeigt er Ihnen für oldVersion und newVersion? – Eliodorus

+0

Ich werde das sehen müssen .. warten –

Verwandte Themen