SQLite数据库突然停止工作

时间:2017-10-27 14:13:20

标签: android database sqlite android-sqlite

我正在使用SQLite数据库来保存锻炼信息。在我进行更新后,我的数据库停止工作,我无法再从数据库中查看任何已保存的数据。在尝试修复它一段时间后,我恢复到旧的提交,然后对数据库进行了任何更改并清除了应用程序中的数据和缓存,并在我的设备上运行旧版本,但现在甚至是那个旧版本 - 我知道它已经工作了之前很好 - 无法将任何数据库保存到手机中。不确定问题可能是什么,但我将不胜感激。

来自我的数据库的代码:

public class WorkoutDBHandler extends SQLiteOpenHelper{

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "workouts2.db";
    public static final String TABLE_WORKOUTS = "workouts2";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_DATE = "date";
    public static final String COLUMN_WORKOUTNAME = "name";
    public static final String COLUMN_EXERCISENAMES = "exercises";

    public WorkoutDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, DATABASE_NAME, factory, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = " CREATE TABLE " + TABLE_WORKOUTS + " ( " +
                COLUMN_ID + " INTEGER PRIMARY KEY," +
                COLUMN_WORKOUTNAME + " TEXT," +
                COLUMN_DATE + "INTEGER" +
                COLUMN_EXERCISENAMES + " TEXT " +
                ");";
        db.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP_TABLE_IF_EXISTS " + TABLE_WORKOUTS);
        onCreate(db);
    }

    //Add a new workout to the database
    public void addWorkout(Workout workout){
        ContentValues values = new ContentValues();
        values.put(COLUMN_WORKOUTNAME,workout.getName());
        values.put(COLUMN_EXERCISENAMES,workout.exerciseNamesToString());
        values.put(COLUMN_DATE,workout.getDate().getTime());
        SQLiteDatabase db = getWritableDatabase();
        db.insert(TABLE_WORKOUTS, null, values);
        db.close();
    }

    //Removes a workout with the name workoutName from the database
    public void deleteWorkout(String workoutName){
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("DELETE FROM " + TABLE_WORKOUTS + " WHERE " + COLUMN_WORKOUTNAME + "='" + workoutName + "';");
        db.close();
    }

    //Returns a list of the users workouts that are stored in the database
    public ArrayList<Workout> getWorkouts(){
        ArrayList<Workout> workoutList = new ArrayList<>();
        SQLiteDatabase db = getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_WORKOUTS + " WHERE 1";

        Cursor c = db.rawQuery(query, null);
        c.moveToFirst();
        while(!c.isAfterLast()){
            if(c.getString(c.getColumnIndex(COLUMN_WORKOUTNAME))!=null){
                String workoutName = c.getString(c.getColumnIndex(COLUMN_WORKOUTNAME));
                String exerciseNames = c.getString(c.getColumnIndex(COLUMN_EXERCISENAMES));
                Date workoutDate = new Date(c.getLong(c.getColumnIndex(COLUMN_DATE)));

                ArrayList<String> list = new ArrayList<String>(Arrays.asList(exerciseNames.split(",")));
                workoutList.add(new Workout(workoutName, workoutDate, list));
            }
            c.moveToNext();
        }
        db.close();
        return workoutList;
    }

    //Returns the number of rows in the exercise table
    public int numWorkouts(){
        String countQuery = "SELECT  * FROM " + TABLE_WORKOUTS;
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        int count = cursor.getCount();
        cursor.close();
        return count;
    }
}

1 个答案:

答案 0 :(得分:2)

onCreate方法

中的数据库创建脚本中存在一些错误

更具体地说,这一行:

COLUMN_DATE + "INTEGER" +

应该是:

 COLUMN_DATE + " INTEGER, " +

注意INTEGER之前的空格和之后的逗号,

修改 您必须再次卸载并重新安装该应用才能使更改生效。