"No such column" 进行 SQLite 查询时

"No such column" when making SQLite query

我似乎找不到我的代码中的错误。我尝试删除数据库并更改版本号,因为我后来添加了 bottom_time,但它似乎无法识别它。尝试在 getDiveList() 中执行 db.query 时显示错误-方法.

public class DatabaseHelper extends SQLiteOpenHelper {

    //---DB Details-------------------------------------
    public static final String DATABASE_NAME = "SpotTheFish.db";
    public static final int DATABASE_VERSION = 3;


    //---User Dives------------------------------
    public static final String DIVE_TABLE_NAME = "all_dives";
    public static final String DIVE_ID = "dive_id";
    public static final String KEY_LOCATION_NAME = "dive_location";
    public static final String KEY_DATE = "date";
    public static final String KEY_TIME_IN = "time_in";
    public static final String KEY_TIME_OUT = "time_out";
    public static final String KEY_BOTTOM_TIME = "bottom_time";
    public static final String KEY_BARS_START = "bars_at_start";
    public static final String KEY_BARS_END = "bars_at_end";
    public static final String KEY_DEPTH = "depth";
    public static final String KEY_TEMPERATURE = "temperature";
    public static final String KEY_VISIBILITY = "visibility";
    public static final String[] DIVE_TABLE_KEYS = {DIVE_ID, LINK_STATES_REGIONS_ID, KEY_LOCATION_NAME, KEY_DATE, KEY_TIME_IN, KEY_TIME_OUT, KEY_BOTTOM_TIME, KEY_BARS_START, KEY_BARS_END, KEY_DEPTH, KEY_TEMPERATURE, KEY_VISIBILITY};

    public static final int COL_DIVE_ID = 0;
    public static final int COL_DIVE_LINK_STATES_REGIONS = 1;
    public static final int COL_LOCATION_NAME = 2;
    public static final int COL_DATE = 3;
    public static final int COL_TIME_IN = 4;
    public static final int COL_TIME_OUT = 5;
    public static final int COL_BOTTOM_TIME = 6;
    public static final int COL_BARS_START = 7;
    public static final int COL_BARS_END = 8;
    public static final int COL_DEPTH = 9;
    public static final int COL_TEMPERATURE = 10;
    public static final int COL_VISIBILITY = 11;

    private static final String CREATE_DIVE_TABLE =
            "CREATE TABLE " + DIVE_TABLE_NAME + " (" +
                    DIVE_ID + " INTEGER PRIMARY KEY, " +
                    LINK_STATES_REGIONS_ID + " INTEGER, " +
                    KEY_LOCATION_NAME + " TEXT, " +
                    KEY_DATE + " TEXT, " +
                    KEY_TIME_IN + " TEXT, " +
                    KEY_TIME_OUT + " TEXT" +
                    KEY_BOTTOM_TIME + " TEXT, " +
                    KEY_BARS_START + " TEXT, " +
                    KEY_BARS_END + " TEXT" +
                    KEY_DEPTH + " TEXT, " +
                    KEY_TEMPERATURE + " TEXT, " +
                    KEY_VISIBILITY + " TEXT" +
                    ")";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {                
            db.execSQL(CREATE_DIVE_TABLE);                 
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

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

        db.execSQL("DROP TABLE IF EXISTS " + DIVE_TABLE_NAME);
    }

    /**
     * Creates an ArrayList and adds all rows from
     * existing database table
     *
     * @return: ArrayList of subjects
     */
    public ArrayList<Dive> getDiveList() {

        ArrayList<Dive> diveList = new ArrayList<>();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(DIVE_TABLE_NAME, DIVE_TABLE_KEYS,
                null, null, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                Dive dive = new Dive(cursor.getLong(DatabaseHelper.COL_DIVE_ID),
                        cursor.getLong(COL_DIVE_LINK_STATES_REGIONS),
                        cursor.getString(COL_LOCATION_NAME),
                        cursor.getString(COL_DATE),
                        cursor.getString(COL_TIME_IN),
                        cursor.getString(COL_TIME_OUT),
                        cursor.getString(COL_BOTTOM_TIME),
                        cursor.getString(COL_BARS_START),
                        cursor.getString(COL_BARS_END),
                        cursor.getString(COL_DEPTH),
                        cursor.getString(COL_TEMPERATURE),
                        cursor.getString(COL_VISIBILITY));
                diveList.add(dive);
                cursor.moveToNext();
            }
        }

        cursor.close();
        db.close();
        return diveList;
    }
}

这是错误日志:

 --------- beginning of crash
05-18 13:43:19.820 7044-7044/com.id12538676.catchemallfishcollection E/AndroidRuntime: FATAL EXCEPTION: main

                                                                                       Process: com.id12538676.catchemallfishcollection, PID: 7044
                                                                                       java.lang.RuntimeException: Unable to start activity ComponentInfo{com.id12538676.catchemallfishcollection/com.id12538676.catchemallfishcollection.StartActivity}: android.database.sqlite.SQLiteException: no such column: bottom_time (code 1): , while compiling: SELECT dive_id, state_region_link_id, dive_location, date, time_in, time_out, bottom_time, bars_at_start, bars_at_end, depth, temperature, visibility FROM all_dives
                                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                                           at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                           at android.os.Looper.loop(Looper.java:148)
                                                                                           at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                                        Caused by: android.database.sqlite.SQLiteException: no such column: bottom_time (code 1): , while compiling: SELECT dive_id, state_region_link_id, dive_location, date, time_in, time_out, bottom_time, bars_at_start, bars_at_end, depth, temperature, visibility FROM all_dives
                                                                                           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.SQLiteQuery.<init>(SQLiteQuery.java:37)
                                                                                           at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                                                                                           at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
                                                                                           at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)
                                                                                           at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
                                                                                           at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1240)
                                                                                           at com.id12538676.catchemallfishcollection.DatabaseHelper.getDiveList(DatabaseHelper.java:364)
                                                                                           at com.id12538676.catchemallfishcollection.DatabaseManager.<init>(DatabaseManager.java:26)
                                                                                           at com.id12538676.catchemallfishcollection.DatabaseManager.getInstance(DatabaseManager.java:19)
                                                                                           at com.id12538676.catchemallfishcollection.StartActivity.onCreate(StartActivity.java:29)
                                                                                           at android.app.Activity.performCreate(Activity.java:6237)
                                                                                           at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                                           at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                                           at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                           at android.os.Looper.loop(Looper.java:148) 
                                                                                           at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                                           at java.lang.reflect.Method.invoke(Native Method) 
                                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
KEY_TIME_OUT + " TEXT" +
KEY_BOTTOM_TIME + " TEXT, " +

您在前面的列声明中遗漏了一个 , 逗号。你在其他一些专栏上也有同样的问题。

添加到那里后,您可以卸载您的应用程序以重新创建数据库。

您应该在升级中调用创建函数:

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

    db.execSQL("DROP TABLE IF EXISTS " + DIVE_TABLE_NAME);
    onCreate(db);
}

并且您还应该按如下方式替换您的创建查询:

private static final String CREATE_DIVE_TABLE =
        "CREATE TABLE " + DIVE_TABLE_NAME + " (" +
                DIVE_ID + " INTEGER PRIMARY KEY, " +
                LINK_STATES_REGIONS_ID + " INTEGER, " +
                KEY_LOCATION_NAME + " TEXT, " +
                KEY_DATE + " TEXT, " +
                KEY_TIME_IN + " TEXT, " +
                KEY_TIME_OUT + " TEXT, " +
                KEY_BOTTOM_TIME + " TEXT, " +
                KEY_BARS_START + " TEXT, " +
                KEY_BARS_END + " TEXT, " +
                KEY_DEPTH + " TEXT, " +
                KEY_TEMPERATURE + " TEXT, " +
                KEY_VISIBILITY + " TEXT" +
                ")";

请检查 table 创建查询.. 您错过了一个逗号,在键超时文本后

KEY_TIME_IN + " TEXT, " + KEY_TIME_OUT + " TEXT" + KEY_BOTTOM_TIME + " TEXT, "