I'm working with databases and I have the following DataBaseHandling class:
我正在使用数据库,我有下面的数据库处理类:
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;
}
The logcat shows:
logcat显示:
android.database.sqlite.SQLiteException: no such column: basal (code 1):, while compiling: SELECT id, date, timeHour, timeMinute, be_intake, glucose, bolus, basal FROM mesaures WHERE date=? ORDER BY timeHour DESC LIMIT 1
android.database.sqlite。SQLiteException:没有此类列:basic(代码1):,编译时:选择id, date, timeHour, timeMinute, be_acceptance,葡萄糖,bolus, basic FROM mesaures WHERE date=?限时订货
I would thank all your help
谢谢你的帮助
My Logcat (after resolving the first problem)
我的Logcat(解决第一个问题后)
08-27 14:34:51.316: E/AndroidRuntime(772): FATAL EXCEPTION: main 08-27 14:34:51.316: E/AndroidRuntime(772): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 08-27 14:34:51.316: E/AndroidRuntime(772): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418) 08-27 14:34:51.316: E/AndroidRuntime(772): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 08-27 14:34:51.316: E/AndroidRuntime(772): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 08-27 14:34:51.316: E/AndroidRuntime(772): at com.example.t1diabetes.DatabaseHandler.getLastMeasure(DatabaseHandler.java:92) 08-27 14:34:51.316: E/AndroidRuntime(772): at com.example.t1diabetes.Mymeasures.calculateBasal(Mymeasures.java:263) 08-27 14:34:51.316: E/AndroidRuntime(772): at com.example.t1diabetes.Mymeasures.access$1(Mymeasures.java:262) 08-27 14:34:51.316: E/AndroidRuntime(772): at com.example.t1diabetes.Mymeasures$1.onClick(Mymeasures.java:99) 08-27 14:34:51.316: E/AndroidRuntime(772): at android.view.View.performClick(View.java:4084) 08-27 14:34:51.316: E/AndroidRuntime(772): at android.view.View$PerformClick.run(View.java:16966) 08-27 14:34:51.316: E/AndroidRuntime(772): at android.os.Handler.handleCallback(Handler.java:615) 08-27 14:34:51.316: E/AndroidRuntime(772): at android.os.Handler.dispatchMessage(Handler.java:92) 08-27 14:34:51.316: E/AndroidRuntime(772): at android.os.Looper.loop(Looper.java:137) 08-27 14:34:51.316: E/AndroidRuntime(772): at android.app.ActivityThread.main(ActivityThread.java:4745) 08-27 14:34:51.316: E/AndroidRuntime(772): at java.lang.reflect.Method.invokeNative(Native Method) 08-27 14:34:51.316: E/AndroidRuntime(772): at java.lang.reflect.Method.invoke(Method.java:511) 08-27 14:34:51.316: E/AndroidRuntime(772): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 08-27 14:34:51.316: E/AndroidRuntime(772): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 08-27 14:34:51.316: E/AndroidRuntime(772): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(772):致命例外:main 08-27 14:34:51.316: E/AndroidRuntime(772): android.database。每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑每日一笑(字幕)(字幕版)(字幕版)(字幕版)(字幕版)(字幕版)(字幕版)(字幕版)(字幕版)(字幕版)(字幕版)(字幕版)在android.app.ActivityThread.main(ActivityThread.java:4745) 08-27 14:34:51.316: E/AndroidRuntime(772): at java.lang.reflect.Method。每日翻译(08/27):每日翻译(08/27):每日翻译(772):在爪哇。主要(本地方法)
5 个解决方案
#1
5
Use a space after KEY_BASAL column . As your table column name was not correct , the table was created without this column. So after modifying code re-install your database or change version.Then you will get correct table with columns
在key_basic列之后使用空格。由于您的表列名称不正确,因此在没有这个列的情况下创建了表。因此,修改代码后,重新安装数据库或更改版本。然后,您将得到具有列的正确的表。
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();
///
}
#2
2
There is a problem that you have missed a space at the Key_basal and also placed an extra comma at the end of your onCreate method. Your code :
有一个问题是您错过了key_basic的一个空格,并在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);
}
It should be :
应该是:
// 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);
}
#3
1
Autoincrement KEY_ID
or put some data to KEY_ID
as well as put your full log cat here:
自动增加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" + ")";
#4
1
Remove ,
End of Query
删除,查询结束
KEY_BASAL + "REAL NOT NULL," + ")";
^
| Here
And Use Space For Concat Strings
并使用空间来处理字符串。
KEY_BASAL + "REAL NOT NULL," + ")";
^
| Here
GoodLuck
古德勒克
#5
0
I got this error while using junit tests. And my error was simple but evil.
我在使用junit测试时犯了这个错误。我的错误很简单,但却是邪恶的。
I mixed getContext()
and getMockConetext()
.
我混合了getContext()和getMockConetext()。
#1
5
Use a space after KEY_BASAL column . As your table column name was not correct , the table was created without this column. So after modifying code re-install your database or change version.Then you will get correct table with columns
在key_basic列之后使用空格。由于您的表列名称不正确,因此在没有这个列的情况下创建了表。因此,修改代码后,重新安装数据库或更改版本。然后,您将得到具有列的正确的表。
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();
///
}
#2
2
There is a problem that you have missed a space at the Key_basal and also placed an extra comma at the end of your onCreate method. Your code :
有一个问题是您错过了key_basic的一个空格,并在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);
}
It should be :
应该是:
// 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);
}
#3
1
Autoincrement KEY_ID
or put some data to KEY_ID
as well as put your full log cat here:
自动增加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" + ")";
#4
1
Remove ,
End of Query
删除,查询结束
KEY_BASAL + "REAL NOT NULL," + ")";
^
| Here
And Use Space For Concat Strings
并使用空间来处理字符串。
KEY_BASAL + "REAL NOT NULL," + ")";
^
| Here
GoodLuck
古德勒克
#5
0
I got this error while using junit tests. And my error was simple but evil.
我在使用junit测试时犯了这个错误。我的错误很简单,但却是邪恶的。
I mixed getContext()
and getMockConetext()
.
我混合了getContext()和getMockConetext()。