无法将数据保存到SQLite数据库

时间:2017-03-23 15:57:54

标签: java android sqlite

我正在开发一个健身追踪器Android应用程序,并成功建立了一个包含2个表的SQLite数据库。一张表用于保存有关心肺功能的数据,一张表用于保存有关举重练习的数据。我能够将信息保存到有氧运动桌(saved_workout_cardio)但是,我似乎无法将任何东西保存到举重表(saved_workout_weights)。我开始编写保存到'saved_workout_cardio'表的功能,一旦我成功完成了工作,我只需复制并粘贴代码并编辑它以适应保存到'saved_workout_weights'表所需的内容,但不幸的是它不是工作,我很困惑为什么。

以下是我在databasehelper java类中创建数据库的代码以及2个方法,1用于将数据保存到每个表中:

public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "FitnessTracker.db";
public static final String TABLE_WEIGHTS = "saved_workout_weights";
public static final String COL_1 = "ID";
public static final String COL_2 = "DATE";
public static final String COL_3 = "EXERCISE";
public static final String COL_4 = "WEIGHT";
public static final String COL_5 = "REPS";
public static final String COL_6 = "SETS";

public static final String TABLE_CARDIO = "saved_workout_cardio";
public static final String COL_1a = "ID";
public static final String COL_2a = "DATE";
public static final String COL_3a = "TIME";

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

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_WEIGHTS + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,DATE TEXT,EXERCISE TEXT,WEIGHT INTEGER,REPS INTEGER)");
    db.execSQL("create table " + TABLE_CARDIO + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,DATE TEXT,TIME INTEGER)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_WEIGHTS);
    db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_CARDIO);

    onCreate(db);
}

public boolean saveData (String date, String time) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_2a, date);
    contentValues.put(COL_3a, time);
    long result = db.insert(TABLE_CARDIO, null, contentValues);
    if(result == -1)
        return false;
    else
        return true;
}

public boolean saveData2 (String date, String exercise, String weight, String reps, String sets) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues2 = new ContentValues();
    contentValues2.put(COL_2, date);
    contentValues2.put(COL_3, exercise);
    contentValues2.put(COL_4, weight);
    contentValues2.put(COL_5, reps);
    contentValues2.put(COL_6, sets);
    long result = db.insert(TABLE_WEIGHTS, null, contentValues2);
    if(result == -1)
        return false;
    else
        return true;
}

}

现在这里是我的'Cardio'java类中的相关代码,我正在调用将数据保存到有氧表的方法(这种方法有效并且我能够成功地将数据保存到有氧运动表中:

public void saveCardioData () {
    btnSaveCardio.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    boolean isInserted = myDb.saveData(txtDate.getText().toString(),
                            txtTimer.getText().toString() );
                    if(isInserted = true)
                        Toast.makeText(Cardio.this, "Workout saved", Toast.LENGTH_LONG).show();
                    else
                        Toast.makeText(Cardio.this, "Error saving workout", Toast.LENGTH_LONG).show();
                }
            }
    );
}

现在这里是'权重'java类,我在其中调用将数据保存到权重表的方法。正如您所看到的,如果成功插入数据,我已设置了一个Toast消息。每当我点击在我的应用程序中保存锻炼时,toast消息告诉我锻炼已成功保存,但是当我检查数据库中的权重表时,没有保存任何值。

public void saveWeightsData () {
    btnSaveWeights.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    boolean isInserted = myDb.saveData2(exerciseVal.getText().toString(),
                            weightVal.getText().toString(),
                            repVal.getText().toString(),
                            setVal.getText().toString(),
                            dateVal.getText().toString() );
                    if(isInserted = true)
                        Toast.makeText(WeightsMain.this, "Workout saved", Toast.LENGTH_LONG).show();
                    else
                        Toast.makeText(WeightsMain.this, "Error saving workout", Toast.LENGTH_LONG).show();
                }
            }
    );
}

我为什么遇到这个问题真的很困惑,所以如果有人能告诉我为什么会非常感激! :)

编辑:我在Android工作室中使用Android设备监视器将数据库从android模拟器的存储器拉到我的电脑上。然后我使用SQLite Manager firefox addon来检查2个表。

1 个答案:

答案 0 :(得分:1)

您的表中没有SETS列,但您正在尝试向其中插入数据。那不行。

SETS列添加到CREATE TABLE后,您可以卸载应用以强制onCreate()再次执行。