首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在RecyclerView中显示SQLite DB数组列表时总是崩溃

在RecyclerView中显示SQLite DB数组列表时总是崩溃
EN

Stack Overflow用户
提问于 2019-05-21 01:39:54
回答 1查看 96关注 0票数 -1

我正在设置一个RecyclerView来查看数据库中数据的ArrayList (最初为空)。然而,它一直在Android虚拟设备上崩溃。我是Android Studio的新手,我正在做一个个人项目。我使用了不同的书籍和视频来创造我所拥有的东西。

我正在尝试按字母顺序列出具有共同类别的所有数据。但如果数据不存在,则显示id/emptyView textView。

我想我的错误可能是在我的适配器中,在ViewHolder中选择了错误的textViews,或者在onCreateViewHolder中选择了错误的膨胀布局,因为我有点困惑,他们应该指出这一点。或者我的db.query游标中的错误。

Logcat:

代码语言:javascript
复制
FATAL EXCEPTION: main
Process: com.HSC.calendarfit, PID: 10164
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.HSC.calendarfit/com.HSC.calendarfit.ExerciseList}: android.database.sqlite.SQLiteException: unrecognized token: ""Arms ORDER BY exerciseName ASC" (code 1 SQLITE_ERROR): , while compiling: SELECT exerciseName FROM exerciseList WHERE muscleGroup = "Arms ORDER BY exerciseName ASC
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: android.database.sqlite.SQLiteException: unrecognized token: ""Arms ORDER BY exerciseName ASC" (code 1 SQLITE_ERROR): , while compiling: SELECT exerciseName FROM exerciseList WHERE muscleGroup = "Arms ORDER BY exerciseName ASC
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:903)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:514)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1408)
    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1255)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1126)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1294)
    at com.HSC.calendarfit.dbExerciseListHandler$override.getExercises(dbExerciseListHandler.java:65)
    at com.HSC.calendarfit.dbExerciseListHandler$override.access$dispatch(Unknown Source:64)
    at com.HSC.calendarfit.dbExerciseListHandler.getExercises(Unknown Source:15)
    at com.HSC.calendarfit.ExerciseList.onCreate(ExerciseList.java:43)
    at android.app.Activity.performCreate(Activity.java:7136)
    at android.app.Activity.performCreate(Activity.java:7127)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6669) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

在activity中调用适配器和方法:

代码语言:javascript
复制
       dbHandler = new dbExerciseListHandler(this, null, null, 1);
        muscleCategory = "Arms";
        List<dbExerciseList> list = dbHandler.getExercises(muscleCategory);
        recyclerView = (RecyclerView) findViewById(R.id.rvExerciseList);
        emptyView = (TextView) findViewById(R.id.emptyView);

        if (list.isEmpty()){
            recyclerView.setVisibility(View.GONE);
            emptyView.setVisibility(View.VISIBLE);
        }else{
            recyclerView.setVisibility(View.VISIBLE);
            emptyView.setVisibility(View.GONE);
        }

        recyclerView.setHasFixedSize(true);
        mAdapter = new ExerciseListAdapter(list);

        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(mAdapter);   

方法来获取数据并创建数组列表:

代码语言:javascript
复制
public List<dbExerciseList> getExercises(String muscleGroup){
        List<dbExerciseList> list = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        String[] columnsToUse = {COLUMN_EXERCISENAME};
        Cursor cursor = db.query(TABLE_EXERCISE, columnsToUse, COLUMN_MUSCLEGROUP + " = \"" +
                        muscleGroup, null, null, null, COLUMN_EXERCISENAME + "ASC");
        while (cursor.moveToNext()){
            String exerciseName = cursor.getString(0);
            dbExerciseList name = new dbExerciseList(exerciseName);
            list.add(name);
        }
        return list;

    }

dbExerciseList有我的getter和setter方法。

RecyclerView适配器:

代码语言:javascript
复制
public class ExerciseListAdapter extends RecyclerView.Adapter<ExerciseListAdapter.ExerciseListViewHolder>{

    private List<dbExerciseList> mDataset;


    public class ExerciseListViewHolder extends RecyclerView.ViewHolder {
        public TextView tvExerciseName;
        public ExerciseListViewHolder(@NonNull View itemView) {
            super(itemView);
            tvExerciseName = itemView.findViewById(R.id.tvExerciseName);
        }
    }

    public ExerciseListAdapter(List<dbExerciseList> mDataset) {
        this.mDataset = mDataset;
    }

    @Override
    public ExerciseListViewHolder onCreateViewHolder( ViewGroup viewGroup, int i) {
        TextView v = (TextView) LayoutInflater.from(viewGroup.getContext()).
                inflate(R.layout.activity_exercise_list, viewGroup, false);
        return new ExerciseListViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ExerciseListViewHolder exerciseListViewHolder, int position) {
        dbExerciseList item = mDataset.get(position);
        exerciseListViewHolder.tvExerciseName.setText(item.get_exerciseName());
    }

    @Override
    public int getItemCount() {
        return mDataset.size();
    }
}

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-21 03:03:36

getExercises()内部,下面这行代码:

代码语言:javascript
复制
Cursor cursor = db.query(TABLE_EXERCISE, columnsToUse, COLUMN_MUSCLEGROUP + " = \"" +
    muscleGroup, null, null, null, COLUMN_EXERCISENAME + "ASC");

这是什么:\"

这就是这个字符串:

代码语言:javascript
复制
SELECT exerciseName FROM exerciseList WHERE muscleGroup = "Arms ORDER BY exerciseName ASC

这在语法上是错误的,因为有双引号。

更改为:

代码语言:javascript
复制
Cursor cursor = db.query(TABLE_EXERCISE, columnsToUse, COLUMN_MUSCLEGROUP 
    + " = '" + muscleGroup + "'", null, null, null, COLUMN_EXERCISENAME + "ASC");

(这是您想要做的吗?)

但是,由于这种方式容易发生sql注入,因此最好使用这种方式将参数传递给sql语句:

代码语言:javascript
复制
String strQuery = "SELECT " + COLUMN_EXERCISENAME + " FROM " + TABLE_EXERCISE + 
    " WHERE " + COLUMN_MUSCLEGROUP + " = ? ORDER BY " + COLUMN_EXERCISENAME + " ASC";
Cursor cursor = db.rawQuery(strQuery, new String[] {muscleGroup});

这样你就不必担心你传递的参数的类型了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56225759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档