java SQLite数据库在何处不能正确使用?
该应用程序的目的是根据用户选择的内容从数据库中获取训练,并将其放入一个碎片类的文本视图中。用户可以选择他们的体验,如果他们想使用权重。数据库存储与体验和重量相关的所有训练。例如,在我的数据库中,我可能有一项训练有(“初学者”、“无重量”、“倾斜俯卧撑”)。在应用程序结束时,数据库应该研究用户选择的值。例如,如果用户选择初学者,它应该只查找包含初学者的数据库条目。我希望数据库只返回训练。我正在使用Android Studio来实现这一点,并创建了数据库(以及填充了数据库),但我一直收到相同的错误。下面的第一个方法是在另一个类中,该类应根据数据库中的经验和体重偏好获取训练
public ArrayList<String> getWorkoutByBeginnerAndNoWeights(){
Cursor cursor = database.query(MySQLiteHelper.TABLE_EXERCISES, workoutColumns, MySQLiteHelper.COLUMN_EXPERIENCE + "=" + "beginner" + "AND" + "" + MySQLiteHelper.COLUMN_EQUIPMENT + "=" + "no weights", null, null, null, null);
while(!cursor.isLast()){
int i=0;
String workouts =cursor.getString(i++);
workoutArray.add(workouts);
}
//return string array
return workoutArray;
}
----------
Class for making the database
public class MySQLiteHelper extends SQLiteOpenHelper {
public static final String TABLE_EXERCISES = "exercises";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_EXPERIENCE = "experience";
public static final String COLUMN_EQUIPMENT = "equipment";
public static final String COLUMN_WORKOUT = "workout";
public static final String DATABASE_NAME = "exercises.db";
private static final int DATABASE_VERSION = 1;
// Database creation sql statement
private static final String DATABASE_CREATE = "create table "
+ TABLE_EXERCISES + "(" + COLUMN_ID
+ " integer primary key autoincrement, "+ COLUMN_EXPERIENCE + " text not null, " + COLUMN_EQUIPMENT
+ " text not null, "+ COLUMN_WORKOUT
+ " text not null);";
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(MySQLiteHelper.class.getName(),
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + TABLE_EXERCISES);
onCreate(db);
}
}
-------
Code in fragment to display it as a text using textView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View inf = inflater.inflate(R.layout.fragment_test, container, false);
TextView tv = (TextView) inf.findViewById(R.id.testText);
tv.setText(MainActivity.dataSource.getWorkoutByBeginnerAndNoWeights().toString());
// Inflate the layout for this fragment
return inf;
}
----------
error I am getting
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hfad.workoutmaker, PID: 20245
安卓.database.sqlite.SQLiteException: no such column: beginner (code 1): , while compiling: SELECT _id, workout FROM exercises WHERE experience=beginner
at 安卓.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at 安卓.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at 安卓.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at 安卓.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at 安卓.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at 安卓.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at 安卓.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at 安卓.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1318)
at 安卓.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1165)
at 安卓.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1036)
at 安卓.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1204)
at com.hfad.workoutmaker.WorkoutsDataSource.getWorkoutByBeginnerAndNoWeights(WorkoutsDataSource.java:74)
at com.hfad.workoutmaker.TestFragment.onCreateView(TestFragment.java:41)
at 安卓x.fragment.app.Fragment.performCreateView(Fragment.java:2698)
at 安卓x.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
at 安卓x.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
at 安卓x.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
at 安卓x.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
at 安卓x.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
at 安卓x.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
at 安卓x.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at 安卓.os.Handler.handleCallback(Handler.java:751)
at 安卓.os.Handler.dispatchMessage(Handler.java:95)
at 安卓.os.Looper.loop(Looper.java:154)
at 安卓.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:776)
# 1 楼答案
您应该始终使用
'beginner'
而不是beginner
作为您的值因此,一个简单的SQL语句应该如下所示: