2

私はデータベースを扱っており、次の DataBaseHandling クラスがあります。

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;
}

logcat は次を示します。

android.database.sqlite.SQLiteException: そのような列はありません: 基礎 (コード 1):、コンパイル中: SELECT id、date、timeHour、timeMinute、be_intake、ブドウ糖、ボーラス、基礎 FROM mesaures WHERE date=? ORDER BY timeHour DESC LIMIT 1

私はあなたのすべての助けに感謝します

私のLogcat(最初の問題を解決した後)

08-27 14:34:51.316: E/AndroidRuntime(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.t1diabetes.Mymeasures.access$1(Mymeasures.java:262) 08-27 14:34:51.316: E/AndroidRuntime(772): com.example.t1diabetes.Mymeasures$1 .onClick(Mymeasures.java:99) 08-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.internal.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 (ネイティブ メソッド) で553) 08-27 14:34:51.316: E/AndroidRuntime (772): dalvik.system.NativeStart.main (ネイティブ メソッド) で553) 08-27 14:34:51.316: E/AndroidRuntime (772): dalvik.system.NativeStart.main (ネイティブ メソッド) で

4

5 に答える 5

5

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();

///

}
于 2013-08-27T04:26:29.893 に答える
2

Key_basal でスペースを逃し、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);
}

そのはず :

// 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);
}
于 2013-08-27T04:29:29.063 に答える
1

自動インクリメント KEY_IDするか、いくつかのデータをKEY_ID入れて、完全なログ cat をここに入れます。

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" + ")";
于 2013-08-27T05:14:42.240 に答える
0

junit テストの使用中にこのエラーが発生しました。そして、私の過ちは単純ですが悪でした。

getContext()とを混ぜgetMockConetext()ました。

于 2013-11-25T16:55:27.050 に答える