【问题标题】:read data from SQLite database using AsyncTask on button press按下按钮时使用 AsyncTask 从 SQLite 数据库中读取数据
【发布时间】: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


【解决方案1】:

doInBackground 中只是准备ContentValues 插入数据库,但没有调用SQLiteDatabase.insert 方法在数据库中添加新行:

long rowID=db.insert(DBHelper.TABLE_NAME, null, values);

在按钮按下时:

Caused by: android.database.CursorIndexOutOfBoundsException

因为cursor 为空而出错。

为避免此错误,请使用Cursor.getCount() 在读取光标对象之前检查它是否包含行。

【讨论】:

  • 我想更好的问题是我在创建 rowID 后如何处理它?
  • @thenry:不,rowID 仅用于检查是否成功插入行。如果未插入,则 rowID 将为 -1
  • 感谢您的帮助,它不再报错。但我不认为数据库正在被填充,因为当我设置 TextView 时它是空白的。您发现有什么问题吗?
  • @thenry: 检查val = Float.toString(itemId);这一行的值
  • val 变空了,所以解释一下,我还检查了 itemId,它得到了 0.0,所以 COLUMN_DISTANCE 一定没有得到预期的距离值(我检查了距离,它是 10)。这与我在 doInBackground 结束时返回 null 有关吗?
猜你喜欢
  • 1970-01-01
  • 2013-08-11
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多