2013-08-27 2 views
2
나는 데이터베이스와 함께 일하고 있어요

나는 다음과 같은 DataBaseHandling 클래스를 한 :SQLiteException : 그런 칼럼 : 기초 (코드 1)

public class DatabaseHandler extends SQLiteOpenHelper { 

// All Static variables 
// Database Version 
private static final int DATABASE_VERSION = 4; 

// Database Name 
private static final String DATABASE_MEASURES = "measuresDataBase"; 

// Measures table name 
private static final String TABLE_MEASURES = "measures"; 

// Measures Table Columns names 
private static final String KEY_ID = "id"; 
private static final String KEY_DATE = "date"; 
private static final String KEY_TIME_HOUR = "timeHour"; 
private static final String KEY_TIME_MINUTE = "timeMinute"; 
private static final String KEY_BE_INTAKE = "be_intake"; 
private static final String KEY_GLUCOSE = "glucose"; 
private static final String KEY_BOLUS = "bolus"; 
private static final String KEY_BASAL = "basal"; 

public DatabaseHandler(Context context) { 
    super(context, DATABASE_MEASURES, null, DATABASE_VERSION); 
} 

// Creating Tables 
@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_MEASURES_TABLE = "CREATE TABLE " + TABLE_MEASURES + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," + KEY_DATE + " TEXT," 
      + KEY_TIME_HOUR + " INTEGER NOT NULL," + KEY_TIME_MINUTE 
      + " INTEGER NOT NULL," + KEY_BE_INTAKE + " REAL NOT NULL," 
      + KEY_GLUCOSE + " REAL NOT NULL," + KEY_BOLUS 
      + " REAL NOT NULL," + KEY_BASAL + "REAL NOT NULL," + ")"; 

    db.execSQL(CREATE_MEASURES_TABLE); 
} 

// Upgrading database 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // Drop older table if existed 

    db.execSQL("DROP TABLE IF EXISTS " + TABLE_MEASURES); 

    // Create tables again 
    onCreate(db); 
} 

// Adding new contact 
public void addMeasure(Measures m) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_DATE, m.getDate()); 
    values.put(KEY_TIME_HOUR, m.getTimeHour()); 
    values.put(KEY_TIME_MINUTE, m.getTimeMinute()); 
    values.put(KEY_BE_INTAKE, m.getBolus()); 
    values.put(KEY_GLUCOSE, m.getGlucose()); // Contact Name 
    values.put(KEY_BOLUS, m.getBolus()); // Contact Phone Number 
    values.put(KEY_BASAL, m.getBasal()); 

    // Inserting Row 
    db.insert(TABLE_MEASURES, null, values); 
    db.close(); // Closing database connection 
} 

public Measures getLastMeasure(String date) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_MEASURES, new String[] { KEY_ID, 
      KEY_DATE, KEY_TIME_HOUR, KEY_TIME_MINUTE, KEY_BE_INTAKE, 
      KEY_GLUCOSE, KEY_BOLUS, KEY_BASAL }, KEY_DATE + "=?", 
      new String[] { date }, null, null, 
      KEY_TIME_HOUR + " DESC, " + KEY_TIME_MINUTE + " DESC", "1"); 
    if (cursor != null) 
     cursor.moveToFirst(); 

    Measures m = new Measures(Long.parseLong(cursor.getString(0)), // id 
      cursor.getString(1), // date 
      Integer.parseInt(cursor.getString(2)), // timeHour 
      Integer.parseInt(cursor.getString(3)), // timeMinute 
      Double.parseDouble(cursor.getString(4)), // BE intake 
      Double.parseDouble(cursor.getString(5)), // glucose 
      Double.parseDouble(cursor.getString(6)), // bolus 
      Double.parseDouble(cursor.getString(7)) // basal 

    ); 
    // return m 
    return m; 
} 

// Getting All Measures 
public List<Measures> getAllMeasures() { 
    List<Measures> measureList = new ArrayList<Measures>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_MEASURES; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      Measures m = new Measures(); 
      m.setId(Long.parseLong(cursor.getString(0))); 
      m.setDate(cursor.getString(1)); 
      m.setTimeHour(Integer.parseInt(cursor.getString(2))); 
      m.setTimeMinute(Integer.parseInt(cursor.getString(3))); 
      m.setBe_intake(Double.parseDouble(cursor.getString(4))); 
      m.setGlucose(Double.parseDouble(cursor.getString(5))); 
      m.setBolus(Double.parseDouble(cursor.getString(6))); 
      m.setBasal(Double.parseDouble(cursor.getString(7))); 
      // Adding measure to list 
      measureList.add(m); 
     } while (cursor.moveToNext()); 
    } 

    // return contact list 
    return measureList; 
} 

로그 캣 보여줍니다 :

android.database.sqlite .SQLiteException : 해당 열 없음 : basal (코드 1) : 컴파일 중 : select id, date, timeHour, timeMinute, be_intake, glucose, bolus, basal FROM mesaures date =? (E/AndroidRuntime : 34 : 51.316 timeHour DESC의 LIMIT BY ORDER 1

나는 (첫 번째 문제를 해결 한 후) 모든 당신의 도움을

08-27 (14)

내 로그 캣 감사 것 772) : 치명적인 예외 : 주 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : android.database.CursorIndexOutOfBoundsException : 크기 0의 색인 0이 요청되었습니다. 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : android.database.AbstractCursor.checkPosition (AbstractCursor.java:418) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : android.database.AbstractWindowedCursor.checkPosition (AbstractWindowedCursor.java:136) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : android.database. AbstractWindowedCursor.getString (AbstractWindowedCursor.java:50) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : com.example.t1diabetes.DatabaseHandler.getLastMeasure (DatabaseHandler.java:92) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : com.example.t1diabetes.Mymeasures.calculateBasal (Mymeasures.java:263) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : com.example. (Mymeasures.java:992) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : -27 14 : 34 : 51.316 : E/AndroidRuntime (772) : android.view.View.performClick (View.java:4084)) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : android.view.View $ PerformClick.run (View.java:16966) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772)) : android.os.Handler.handleCallback (Handler.java:615) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : android.os.Handler.dispatchMessage (Handler.java:92) 08/27 14 : 34 : 51.316 : E/AndroidRuntime (772) : android.os.Looper.loop (Looper.java:137) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : android .App.ActivityThread.main (ActivityThread.java:4745) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : java.lang.reflect.Method.invokeNative (기본 메소드) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : java.lang.reflect.Method.invoke (Method.java:511) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : com.android. 인턴 al.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:786) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java : 553) 08-27 14 : 34 : 51.316 : E/AndroidRuntime (772) dalvik.system.NativeStart.main (원시 메소드)

+1

당신의 테이블 구조 –

+0

이 문제를 해결하는 데 도움이 되었습니까 게시 CONCAT 문자열

KEY_BASAL + "REAL NOT NULL," + ")"; ^ | Here 

goodluck는 들어 쿼리

KEY_BASAL + "REAL NOT NULL," + ")"; ^ | Here 

및 사용 공간의 , 끝을 제거? –

+0

아니오, 이제 CursorIndexOutOfBoundsException 있습니다 : 인덱스 0 요청한, 0 크기로 – JP88

답변

5

사용 KEY_BASAL 열 후의 공간. 테이블 열 이름이 올바르지 않으므로 테이블이이 열없이 만들어졌습니다. 그래서 코드를 수정 한 후 데이터베이스를 재 설치하거나 당신이 Key_basal에서 공간을 놓친 또한 마지막에 추가 쉼표를 배치 한 문제가 있습니다

String CREATE_MEASURES_TABLE = "CREATE TABLE " + TABLE_MEASURES + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," + KEY_DATE + " TEXT," 
      + KEY_TIME_HOUR + " INTEGER NOT NULL," + KEY_TIME_MINUTE 
      + " INTEGER NOT NULL," + KEY_BE_INTAKE + " REAL NOT NULL," 
      + KEY_GLUCOSE + " REAL NOT NULL," + KEY_BOLUS 
      + " REAL NOT NULL," + KEY_BASAL + " REAL NOT NULL" + ")"; 


if (cursor != null && cursor .getCount()>0){ 

     cursor.moveToFirst(); 

/// 

} 
+0

감사. 내가 변경했지만 지금은 가지고 : CursorIndexOutOfBoundsException : 인덱스 0 0 크기로 요청했습니다 – JP88

+0

check cursor.getcount() 크기. 내 대답을 업데이트했습니다. –

+0

값은 0입니다. – JP88

2

열이 올바른 테이블을 얻을 것이다 version.Then 변경 귀하의 onCreate 메서드 중.코드는 :

// Creating Tables 
@Override 
public void onCreate(SQLiteDatabase db) { 
String CREATE_MEASURES_TABLE = "CREATE TABLE " + TABLE_MEASURES + "(" 
     + KEY_ID + " INTEGER PRIMARY KEY," + KEY_DATE + " TEXT," 
     + KEY_TIME_HOUR + " INTEGER NOT NULL," + KEY_TIME_MINUTE 
     + " INTEGER NOT NULL," + KEY_BE_INTAKE + " REAL NOT NULL," 
     + KEY_GLUCOSE + " REAL NOT NULL," + KEY_BOLUS 
     + " REAL NOT NULL," + KEY_BASAL + " REAL NOT NULL" + ")"; 

db.execSQL(CREATE_MEASURES_TABLE); 
} 
+0

감사. 나는 변경했지만 지금은 가지고 : CursorIndexOutOfBoundsException : 인덱스 0 요청한, 크기가 0 – JP88

1

자동 증가 KEY_ID 또는 KEY_ID에 일부 데이터를 넣어뿐만 아니라 여기에 전체 로그 고양이를 넣어 :

// Creating Tables 
@Override 
public void onCreate(SQLiteDatabase db) { 
String CREATE_MEASURES_TABLE = "CREATE TABLE " + TABLE_MEASURES + "(" 
     + KEY_ID + " INTEGER PRIMARY KEY," + KEY_DATE + " TEXT," 
     + KEY_TIME_HOUR + " INTEGER NOT NULL," + KEY_TIME_MINUTE 
     + " INTEGER NOT NULL," + KEY_BE_INTAKE + " REAL NOT NULL," 
     + KEY_GLUCOSE + " REAL NOT NULL," + KEY_BOLUS 
     + " REAL NOT NULL," + KEY_BASAL + "REAL NOT NULL," + ")"; 

db.execSQL(CREATE_MEASURES_TABLE); 
} 

그것은해야

String CREATE_MEASURES_TABLE = "CREATE TABLE " + TABLE_MEASURES + "(" 
     + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_DATE + " TEXT," 
     + KEY_TIME_HOUR + " INTEGER NOT NULL," + KEY_TIME_MINUTE 
     + " INTEGER NOT NULL," + KEY_BE_INTAKE + " REAL NOT NULL," 
     + KEY_GLUCOSE + " REAL NOT NULL," + KEY_BOLUS 
     + " REAL NOT NULL," + KEY_BASAL + " REAL NOT NULL" + ")"; 
+0

고마워. 나는 변화를 만들었지 만 지금은 가지고 : CursorIndexOutOfBoundsException : 인덱스 0 요청한, 0의 크기와 함께 – JP88

+0

당신은 데이터를 먼저 retrive하려고합니다. 어떻게해야 할 일은 데이터베이스에 데이터를 보내는 방법을 넣어 다음 전화 데이터를 검색하는 방법 –

+0

하지만 모든 것이 정상적으로 데이터베이스에 데이터를 저장하는 "저장"버튼이 있기 때문에 그 작업을 수행 할 수 없습니다. 먼저 결과를보고 액세스해야하는 결과를 계산해야합니다 데이터베이스에 도입 된 마지막 요소로 ... – JP88

0

을 나는이 오류가 발생했습니다 junit 테스트를 사용하는 동안. 그리고 저의 실수는 간단했지만 악했습니다.

나는 getContext()getMockConetext()을 혼합했다.

1

관련 문제