WebHU - Programozási kérdések és válaszok

Az onUpgrade() használata új SQLite Android adatbázistábla létrehozásához

Új vagyok az SQLite adatbázisokban Androidon, ezért egy kis segítségre lenne szükségem. Az általam elkészített alkalmazás tárolja a felhasználók edzési gyakorlatait és az egyes gyakorlatokhoz tartozó ismétléseket. Beállítottam és működik egy adatbázisom, amely egy gyakorlatot és ismétlést fog tárolni, de nem tudom működésre bírni az onUpgrade() metódust, hogy nagyobb adatbázist tudjunk létrehozni a többi gyakorlattal.

Az eredeti kód adatbázist készített a következő oszlopokkal

public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                KEY_EXERCISE + " TEXT NOT NULL, " +
                KEY_EX1REPS1 + " TEXT NOT NULL," +
                KEY_EX1REPS2 + " TEXT NOT NULL," +
                KEY_EX1REPS3 +  " TEXT NOT NULL);"

                );

    }

De például a következőket szeretném hozzátenni

                KEY_EXERCISE2 + " TEXT NOT NULL, " +
                KEY_EX2REPS1 + " TEXT NOT NULL," +
                KEY_EX2REPS2 + " TEXT NOT NULL," +
                KEY_EX2REPS3 + " TEXT NOT NULL);

Megpróbáltam ezt az alábbi onUpgrade módszerrel megtenni, de nem működik

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS" + DATABASE_TABLE); 
        onCreate(db);

    }

Ha valaki meg tudná mondani, hogyan kell hozzáadni az oszlopokat, azt nagyon megköszönném. A következő a teljes adatbázis.java fájl.

public class Database {

public static final String KEY_ROWID = "_id";

public static final String KEY_EXERCISE = "exercise_name";
public static final String KEY_EX1REPS1 = "exercise_rep1";
public static final String KEY_EX1REPS2 = "exercise_rep2";
public static final String KEY_EX1REPS3 = "exercise_rep3";


public static final String KEY_EXERCISE2 = "exercise2_name";
public static final String KEY_EX2REPS1 = "exercise2_rep1";
public static final String KEY_EX2REPS2 = "exercise2_rep2";
public static final String KEY_EX2REPS3 = "exercise2_rep3";


private DbHelper ourHelper; //just a insince of the DbHelper class
private final Context ourContext;
public static SQLiteDatabase ourDatabase;

public static final int COL_ROWID = 0;

private static final String DATABASE_NAME = "Workouts";
static final String DATABASE_TABLE = "exercisesandreps";
private static final int DATABASE_VERSION = 2;

public static final String[] ALL_KEYS = new String[] {KEY_ROWID, KEY_EXERCISE, KEY_EX1REPS1, KEY_EX1REPS2, KEY_EX1REPS3, KEY_EXERCISE2, KEY_EX2REPS1, KEY_EX2REPS2, KEY_EX2REPS3};


private static class DbHelper extends SQLiteOpenHelper{

    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        //context, name, factory, version
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + //each one of these lines defines a column of the database
                KEY_EXERCISE + " TEXT NOT NULL, " +
                KEY_EX1REPS1 + " TEXT NOT NULL," +
                KEY_EX1REPS2 + " TEXT NOT NULL," +
                KEY_EX1REPS3 + " TEXT NOT NULL," +
                KEY_EXERCISE2 + " TEXT NOT NULL, " +
                KEY_EX2REPS1 + " TEXT NOT NULL," +
                KEY_EX2REPS2 + " TEXT NOT NULL," +
                KEY_EX2REPS3 + " TEXT NOT NULL);"

                );

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS" + DATABASE_TABLE); 
        onCreate(db);

    }   
}
public Database(Context c){
    ourContext = c;
}

public Database open() throws SQLException{
    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase(); //use writable because if you can write to it, you can read it
    return this;
}

public void close(){
    ourHelper.close();
}

public long createEntry(String Exercise, String Ex1R1, String Ex1R2, String Ex1R3, String Exercise2, String Ex2R1, String Ex2R2, String Ex2R3) {
    // TODO Auto-generated method stub
    ContentValues cv = new ContentValues();

    //String Exercise1 = convertArrayToString(ExerciseArray);

    cv.put(KEY_EXERCISE, Exercise);
    cv.put(KEY_EX1REPS1, Ex1R1);
    cv.put(KEY_EX1REPS2, Ex1R2);
    cv.put(KEY_EX1REPS3, Ex1R3);


    cv.put(KEY_EXERCISE2, Exercise2);
    cv.put(KEY_EX2REPS1, Ex2R1);
    cv.put(KEY_EX2REPS2, Ex2R2);
    cv.put(KEY_EX2REPS3, Ex2R3);

    return ourDatabase.insert(DATABASE_TABLE, null, cv); //this will crash if you haven't set up a table with rows + columns

}

public String getData() {
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID, KEY_EXERCISE, KEY_EX1REPS1, KEY_EX1REPS2, KEY_EX1REPS3, KEY_EXERCISE2, KEY_EX2REPS1, KEY_EX2REPS2, KEY_EX2REPS3};
    //you read information through a cursor
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
    String result = "";

    //these keep track of the current row, name, hotness
    int iRow = c.getColumnIndex(KEY_ROWID);//position 0
    int iExercise1 = c.getColumnIndex(KEY_EXERCISE);//position 1
    int iEx1R1 = c.getColumnIndex(KEY_EX1REPS1);//position 2
    int iEx1R2 = c.getColumnIndex(KEY_EX1REPS2);//position 3
    int iEx1R3 = c.getColumnIndex(KEY_EX1REPS3);//position 4

    int iExercise2 = c.getColumnIndex(KEY_EXERCISE);//position 1
    int iEx2R1 = c.getColumnIndex(KEY_EX1REPS1);//position 2
    int iEx2R2 = c.getColumnIndex(KEY_EX1REPS2);//position 3
    int iEx2R3 = c.getColumnIndex(KEY_EX1REPS3);//position 4

    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){  //!c.isAfterLast = if our cursor is not after the last entry in our database 
        //starting at the first position, it will move one each go unless it hasn't exceeded the last entry
        result = result + c.getString(iRow) + " " + c.getString(iExercise1) + " " + c.getString(iEx1R1) + " " + c.getString(iEx1R2) + " " + c.getString(iEx1R3) + 
                                                    c.getString(iExercise2) + " " + c.getString(iEx2R1) + " " + c.getString(iEx2R2) + " " + c.getString(iEx2R3) + 

                "\n";

    }
    return result;
}

public String getExercise(long l) throws SQLException{
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID, KEY_EXERCISE, KEY_EX1REPS1, KEY_EX1REPS2, KEY_EX1REPS3, KEY_EXERCISE2, KEY_EX2REPS1, KEY_EX2REPS2, KEY_EX2REPS3};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l,null, null, null, null);

    if(c != null){
        c.moveToFirst();
        String exercise = c.getString(1);//we know the name column is the second column in the database so it will have a position 1
        return exercise;//the code will only return the name if the cursor is set to null
    }

    return null;
}



public String[] getReps1(long l) throws SQLException{
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID, KEY_EXERCISE, KEY_EX1REPS1, KEY_EX1REPS2, KEY_EX1REPS3};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l,null, null, null, null);

    if(c != null){
        c.moveToFirst();
        String reps1 = c.getString(2);//we know the name column is the second column in the database so it will have a position 1
        String reps2 = c.getString(3);
        String reps3 = c.getString(4);
        String[] result = new String[]{reps1, reps2, reps3};
        return result;//the code will only return the name if the cursor is set to null
    }
    return null;
}


public void updateEntry (long lRow, String mExercise, String mEx1Reps1, String mEx1Reps2, String mEx1Reps3) throws SQLException{
    // TODO Auto-generated method stub
    ContentValues cvUpdate = new ContentValues();
    cvUpdate.put(KEY_EXERCISE, mExercise);
    cvUpdate.put(KEY_EX1REPS1, mEx1Reps1);
    cvUpdate.put(KEY_EX1REPS2, mEx1Reps2);
    cvUpdate.put(KEY_EX1REPS3, mEx1Reps3);

    ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_ROWID + "=" + lRow, null);
}

public void deleteEntry(long lRow1) throws SQLException{
    // TODO Auto-generated method stub
    ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + lRow1, null);

}


public static String convertArrayToString(String[] array){
    String str = "";
    for (int i = 0;i<array.length; i++) {
        str = str+array[i];
        // Do not append comma at the end of last element
        if(i<array.length-1){
            str = str+",";
        }
    }
    return str;
}
public static String[] convertStringToArray(String str){
    String[] arr = str.split(",");
    return arr;
}

public void deleteAll() {
    Cursor c = getAllRows();
    long rowId = c.getColumnIndexOrThrow(KEY_ROWID);
    if (c.moveToFirst()) {
        do {
            deleteRow(c.getLong((int) rowId));              
        } while (c.moveToNext());
    }
    c.close();
}

public Cursor getAllRows() {
    String where = null;
    Cursor c =  ourDatabase.query(true, DATABASE_TABLE, ALL_KEYS, 
                        where, null, null, null, null, null);
    if (c != null) {
        c.moveToFirst();
    }
    return c;
}
public boolean deleteRow(long rowId) {
    String where = KEY_ROWID + "=" + rowId;
    return ourDatabase.delete(DATABASE_TABLE, where, null) != 0;
}
}
06.08.2013

Válaszok:


1
  1. Növelje a DATABASE_VERSION értékét, ha még nem tette meg.
  2. Általában ki kell bontani a db.execSQL("....") metódust, amely az onCreate metódusban egy új metódusba, például upgradeDB() néven, majd a onUpgrade metódusban hívhatja meg a upgradeDB() metódust.

vagy teljesen eltávolíthatja az alkalmazást az eszközről, majd újratelepítheti, akkor újra létrehozza az egész db-ot.

06.08.2013
  • Köszönöm, de továbbra is ugyanazt a hibát kapom, mint általában: 08-07 07:35:25.707: E/SQLiteLog(25037): (1) EXISTSexercisesandreps közelében: szintaktikai hiba 07.08.2013
  • Nos, csak váltson a db.execSQL-re (DROP TABLE IF EXISTS + DATABASE_TABLE); vagyis egy üres karakterlánc hozzáadása az EXISTS után. 07.08.2013
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..