【发布时间】:2016-07-20 18:11:05
【问题描述】:
对 SQLite 数据库不是很熟悉,但我已经阅读了一些教程/SO 帖子,但我无法弄清楚我做错了什么。目前我想在按下按钮时保存数据,然后以表格形式将数据读取到另一个活动中。
这是我创建数据库的尝试:
public class DBHelper extends SQLiteOpenHelper {
private final static int DB_VERSION = 10;
static final String DATABASE_NAME = "workout.db";
public static final String TABLE_NAME = "Workout_Log";
public static final String COLUMN_DISTANCE = "Distance";
public static final String COLUMN_SPEED = "Speed";
public static final String COLUMN_DURATION = "Duration";
public static final String SQL_CREATE_WORKOUT_TABLE = "CREATE TABLE " + TABLE_NAME + "(" +
BaseColumns._ID + " INTEGER PRIMARY KEY," +
COLUMN_DISTANCE + " REAL NOT NULL, " +
COLUMN_SPEED + " REAL NOT NULL, " +
COLUMN_DURATION + " REAL NOT NULL );";
public DBHelper(Context context) {
super(context, DATABASE_NAME, null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(SQL_CREATE_WORKOUT_TABLE);
}
这是我在按下按钮时保存数据的地方:
private class WriteToDB extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
DBHelper dbHelper = new DBHelper(getBaseContext());
// Gets the data repository in write mode
SQLiteDatabase db = dbHelper.getWritableDatabase();
try {
// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(DBHelper.COLUMN_DISTANCE, distance);
values.put(DBHelper.COLUMN_CADENCE, roundedLeft + roundedRight);
values.put(DBHelper.COLUMN_DURATION, leftTime + rightTime);
} finally {
db.close();
}
return null;
}
}
在我的 onClickListener 中调用 Async 函数时:
//Saves on Click?
WriteToDB writeToDB = new WriteToDB();
writeToDB.execute();
我相信它已保存,如果我错了,请纠正我,所以我尝试读取 TextView 并将其设置为数据库中的值(以检查它是否有效):
private class ReadFromDB extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
DBHelper dbHelper = new DBHelper(getBaseContext());
// Gets the data repository in write mode
SQLiteDatabase db = dbHelper.getReadableDatabase();
String[] projection = {
BaseColumns._ID,
DBHelper.COLUMN_DISTANCE,
DBHelper.COLUMN_CADENCE,
DBHelper.COLUMN_DURATION
};
Cursor cursor = db.query(
DBHelper.TABLE_NAME,
projection,
null,
null,
null,
null,
null
);
cursor.moveToFirst();
float itemId = cursor.getFloat(
cursor.getColumnIndexOrThrow(DBHelper.COLUMN_DISTANCE)
);
val = Float.toString(itemId);
cursor.close();
return null;
}
}
当我按下按钮访问它时,我得到一个错误:
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
有什么建议吗?
【问题讨论】:
-
您在 WriteToDB 异步任务中究竟在哪里写入 DB?因为我没找到。
标签: android sqlite android-asynctask