【问题标题】:ANDROID Sqli cursor only returning a 1 row after that it give Null Exception [duplicate]ANDROID Sqli 游标仅返回 1 行之后它给出空异常 [重复]
【发布时间】:2016-03-28 20:06:51
【问题描述】:

在数据库助手中选择数据的功能:

 public List<Question> slectQuestionsC(String tab_name) {

    List<Question> quesList = new ArrayList<Question>();
    // Select All Query
    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT * FROM " + tab_name ;

    try {
    Cursor cursor = db.rawQuery(selectQuery, null);

    if(cursor != null){
        cursor.moveToFirst();
    }

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        if (cursor.getCount() > 0) {
        do {
            Question Quiz = new Question();
            Quiz.setID(cursor.getInt(0));
            Quiz.setQUESTION(cursor.getString(1));
            Quiz.setOPT1(cursor.getString(2));
            Quiz.setOPT2(cursor.getString(3));
            Quiz.setOPT3(cursor.getString(4));
            Quiz.setOPT4(cursor.getString(5));
            Quiz.setANSWER(cursor.getString(6));
            Quiz.setHINT(cursor.getString(7));
            quesList.add(Quiz);
        } while (cursor.moveToNext());
    }
    }
    } catch (Exception e) { e.printStackTrace(); }

    return quesList;
}

我在这样的主要活动中调用了这个函数,但它只返回表的第一个值,但我希望它返回表的整个值,以便我可以将它保存到列表中!:

   Question currentQ;
   List<Question> quesList;
   int qid = 0;
   @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    super.onCreate(savedInstanceState);

    db.Open();


        quesList = db.slectQuestionsC(tab_name);
        currentQ = quesList.get(qid);

        setQuestionView();

   next.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            int ansID = options.getCheckedRadioButtonId();
            RadioButton rb_ans = (RadioButton)findViewById(ansID);
            String answer = rb_ans.getText().toString();
            Log.d("yourans", currentQ.getANSWER()+" "+answer);


            if(currentQ.getANSWER().equals(answer))
            {
                scoreT++;
                Log.d("score", "Your score"+scoreT);
            }

            if (qid < 6)
            {
                try {
                currentQ=quesList.get(qid);
                setQuestionView();
                } catch (Throwable e) {
                    e.printStackTrace();
                    Toast("Exception" + e.toString());
                }

            }
            else 
            {
                qid = 1;
                Intent intent = new Intent(CustomQuizActivity.this, Quiz_End.class);
                Bundle b = new Bundle();
                b.putInt("score", scoreT); //Your score
                intent.putExtras(b); //Put your score to your next Intent
                startActivity(intent);
            }


        }
    });

这是设置问题视图的功能!

   private void setQuestionView()
   {

    question_no.setText("Question #" + qid);
    question_text.setText(currentQ.getQUESTION());
    op1.setText(currentQ.getOPT1());
    op2.setText(currentQ.getOPT2());
    op3.setText(currentQ.getOPT3());
    op4.setText(currentQ.getOPT4());



    qid++;

} 

【问题讨论】:

    标签: java android sqlite oop arraylist


    【解决方案1】:

    请注意以下几行:

    if(cursor != null){
       cursor.moveToFirst();
    }
    
    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
    

    您移动了两次光标。只需将null 过滤器添加到您的moveToFirst()

    if (cursor != null && cursor.moveToFirst()) {
     // stuffs
    }
    

    【讨论】:

    • 调用moveToFirst() 两次是无害的。
    • 问题解决了!谢谢
    • @CL。它可能看起来无害,但它实际上所做的是将光标按字面意思移动到第一个位置,如果成功则返回true。如果你在它已经移动的时候移动它,它会抛出一个 NPE。
    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    相关资源
    最近更新 更多