Android SQLite

0

Witam.
Pisze aplikacje która będzie służyć do tworzenia "statystyk: odnośnie wyjazdów z OSP (projekt na studia).
Chciałem podłączyć SQLite do apki aby zbierała dane i w innym activity żeby można było później wyświetlić historie wyjazdów.

Napisałem do tej pory coś takiego:

package com.example.ospapp;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
 
import java.sql.Date;
 
public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String TAG = "DatabaseHelper";
 
    private static final String TABLE_NAME = "departure_table";
    private static final String COL1 = "ID";
    private static final String COL2 = "commander";
    private static final String COL3 = "dateAction";
    private static final String COL4 = "peopleOnAction";
    private static final String COL5 = "timeAction";
    private static final String COL6 = "victimsInAction";
    private static final String COL7 = "typOfAction";
 
 
    public DatabaseHelper(Context context){
        super(context, TABLE_NAME, null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
       String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT , " +
               COL2 + " TEXT," + COL3 + " TEXT," + COL4 + " TEXT," + COL5 + " TEXT," + COL6 + " TEXT," + COL7 + " TEXT);";
 
       db.execSQL(createTable);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
        onCreate(db);
    }
 
    public boolean AddData(String commander, String dateAction,String peopleOnAction, String timeAction, String victimsInAction, String typOfAction) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL2, commander);
        contentValues.put(COL3, dateAction);
        contentValues.put(COL4, peopleOnAction);
        contentValues.put(COL5, timeAction);
        contentValues.put(COL6, victimsInAction);
        contentValues.put(COL7, typOfAction);
 
        Log.d(TAG, "addData: Adding " + commander + " to " + TABLE_NAME);
 
        long result = db.insert(TABLE_NAME, null, contentValues);
 
        //if date as inserted incorrectly it will return -1
        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }
    public Cursor getData(){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_NAME;
        Cursor data = db.rawQuery(query, null);
        return data;
    }
 
    /**
     * Returns only the ID that matches the name passed in
     */
    public Cursor getItemID(String name){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT " + COL1 + " FROM " + TABLE_NAME +
                " WHERE " + COL2 + " = '" + name + "'";
        Cursor data = db.rawQuery(query, null);
        return data;
    }
 
    /**
     * Updates the name field
     */
    public void updateName(String newName, int id, String oldName){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "UPDATE " + TABLE_NAME + " SET " + COL2 +
                " = '" + newName + "' WHERE " + COL1 + " = '" + id + "'" +
                " AND " + COL2 + " = '" + oldName + "'";
        Log.d(TAG, "updateName: query: " + query);
        Log.d(TAG, "updateName: Setting name to " + newName);
        db.execSQL(query);
    }
 
    /**
     * Delete from database
     */
    public void deleteName(int id, String name){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "DELETE FROM " + TABLE_NAME + " WHERE "
                + COL1 + " = '" + id + "'" +
                " AND " + COL2 + " = '" + name + "'";
        Log.d(TAG, "deleteName: query: " + query);
        Log.d(TAG, "deleteName: Deleting " + name + " from database.");
        db.execSQL(query);
    }
 
}

http://wklejto.pl/840340

i dostaje błąd:

2020-06-03 22:07:16.845 13726-13726/com.example.ospapp D/DatabaseHelper: addData: Adding przykład to departure_table
2020-06-03 22:07:16.846 13726-13726/com.example.ospapp E/SQLiteLog: (1) table departure_table has no column named dateAction
2020-06-03 22:07:16.863 13726-13726/com.example.ospapp E/SQLiteDatabase: Error inserting commander=przykład dateAction=3 cze 2020 timeAction=14:55 peopleOnAction=5 victimsInAction=2 typOfAction=wypadek
    android.database.sqlite.SQLiteException: table departure_table has no column named dateAction (code 1 SQLITE_ERROR): , while compiling: INSERT INTO departure_table(commander,dateAction,timeAction,peopleOnAction,victimsInAction,typOfAction) VALUES (?,?,?,?,?,?)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:986)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:593)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:61)
        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:33)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1597)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1468)
        at com.example.ospapp.DatabaseHelper.AddData(DatabaseHelper.java:55)
        at com.example.ospapp.NextDepartureActivity$1.onClick(NextDepartureActivity.java:55)
        at android.view.View.performClick(View.java:7140)
        at android.view.View.performClickInternal(View.java:7117)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27355)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7403)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

http://wklejto.pl/840341

Czy mógłby ktoś rzucić okiem i podpowiedzieć co jest nie tak z tym kodem?

1

Próbujesz insertnąć do bazy danych coś czego baza danych nie rozumie (a konkretnie nie ma kolumny dateAction)

proponuję zapoznać się z Room, bardzo ułatwi Ci życie
https://developer.android.com/topic/libraries/architecture/room
https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#0

0

Dzięki za podpowiedź i materiały chętnie do nich zajrzę.

A wracając tu do problemu wiem że problem leży w tym że baza danych "nie widzi" tej kolumny tylko pytanie czemu ?Przecież w onCreate tworzę ta tabele z taką właśnie kolumna 😕

0

Dobra naprawione fakt faktem łatwiej byłoby room'em ale udało się i tak.
Temat do zamknięcia

1 użytkowników online, w tym zalogowanych: 0, gości: 1