2016-07-20 5 views
0

SQLiteデータベースにはあまりよく慣れていませんが、私はチュートリアル/ SOの投稿を読んでしまいました。現在、私はボタンプレス上にデータを保存し、データをテーブル形式の別のアクティビティに読み込みたいと考えています。ここでボタンを押すとAsyncTaskを使用してSQLiteデータベースからデータを読み込みます

は、データベースの作成で私の試みです:私はボタンを押し上のデータを保存するのはここ

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で非同期関数を呼び出している間:

//Saves on Click? 
        WriteToDB writeToDB = new WriteToDB(); 
        writeToDB.execute(); 

私はそれが保存されていると信じています。私が間違っていると私は正しいと思いますので、私はTextVieデータベース内の値にW(それが動作するかどうかを確認するために):

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 

任意の提案ですか?取得

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

を、ボタンを押して上:cursorが空である

Caused by: android.database.CursorIndexOutOfBoundsException 

エラーのでdoInBackground

+0

正確にWriteToDB非同期タスクでDBに書き込んでいますか?私はそれを見つけられなかったので。 – user3765370

答えて

2

はちょうどDBに挿入するが、データベースに新しい行を追加するためのSQLiteDatabase.insertメソッドを呼び出していないためContentValuesを準備します。

このエラーを回避するには、Cursor.getCount()を使用してCursorオブジェクトに行が含まれているかどうかを確認してから読み取ってください。

+0

私はそれを作成した後、私はrowIDを使って何をするのですか? – thenry

+1

@thenry:いいえ、rowIDは行が正常に挿入されたかどうかをチェックするためのものです。もし挿入されていなければ、rowIDは '-1'になります –

+0

助けてくれてありがとう、それはもはやエラーを与えません。しかし、私はTextViewを設定すると空であるため、DBが挿入されているとは思わない。あなたが見ている問題はありますか? – thenry

関連する問題