android.database.sqlite.SQLiteException:靠近“WHERE”:语法错误(Sqlite 代码 1)

Posted

技术标签:

【中文标题】android.database.sqlite.SQLiteException:靠近“WHERE”:语法错误(Sqlite 代码 1)【英文标题】:android.database.sqlite.SQLiteException: near "WHERE": syntax error (Sqlite code 1) 【发布时间】:2020-11-29 20:19:35 【问题描述】:

如果有人能提供此代码的帮助,我将不胜感激

:,编译时:SELECT * FROM WHERE category = 'B',(操作系统错误 - 2:没有这样的文件或目录)

error from debug

我的 DbHelper 如下

public class DbHelper extends SQLiteOpenHelper 
    private static final String DATABASE_NAME = "Quiz.db";
    private static final String KEY_ID = "id";
    private static final String KEY_QUES = "question";
    private static final String KEY_ANSWER = "answer"; //correct option
    private static final String KEY_OPTA= "opta"; //option a
    private static final String KEY_OPTB= "optb"; //option b
    private static final String KEY_OPTC= "optc"; //option c
    private static final String KEY_OPTD= "optd"; //option d
    private static final String KEY_CAT="category"; //category
    private static final String TABLE_QUEST1 = "questUnit1";
 
    private SQLiteDatabase dbase;

    public DbHelper(Context context) 
        super(context, DATABASE_NAME, null, 1);
    

    public DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 
        super(context, DATABASE_NAME, factory, version);
    

    @Override
    public void onCreate(SQLiteDatabase db) 
        dbase=db;

        String sql1 = "CREATE TABLE IF NOT EXISTS " + TABLE_QUEST1 + " ( "
                + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_QUES
                + " TEXT, " + KEY_ANSWER+ " TEXT, "+KEY_OPTA +" TEXT, "
                +KEY_OPTB +" TEXT, "+KEY_OPTC+" TEXT, "+KEY_OPTD+" TEXT, "+KEY_CAT+" TEXT)";
        db.execSQL(sql1);
        addQuestionsUnit1();

    

        private void addQuestionsUnit1() 
            QuestionUnit1 q101 = new QuestionUnit1("What is the decimal equivalent of the binary number 10111","21","23","39","42","23","B");
            this.addQuestionsUnit1(q101);
            QuestionUnit1 q102 = new QuestionUnit1("In order to write on a floppy disk with your IBM PC, you must first","digitize it","format it","compile it","hardware it","format it","B");
            this.addQuestionsUnit1(q102);
    
    QuestionUnit1 q249= new QuestionUnit1("Firewalls are used to protect against","Unauthorized Attacks","Viruses","Fire Attacks","Data Driven Attacks","Unauthorized Attacks","E");
            this.addQuestionsUnit1(q249);
            QuestionUnit1 q250= new QuestionUnit1("The first Digital Computer introduced, was named as ","UNIVAC","EDSAC","ENIAC","MARK-1","MARK-1","E");
            this.addQuestionsUnit1(q250);
    
        

    public void addQuestionsUnit1(QuestionUnit1 quest) 
        //SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_QUES, quest.getQUESTION1());
        values.put(KEY_ANSWER, quest.getANSWER1());
        values.put(KEY_OPTA, quest.getOPTA1());
        values.put(KEY_OPTB, quest.getOPTB1());
        values.put(KEY_OPTC, quest.getOPTC1());
        values.put(KEY_OPTD, quest.getOPTD1());
        values.put(KEY_CAT,quest.getCATEGORY1());
        // Inserting Row
        dbase.insert(TABLE_QUEST1, null, values);
    



    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 

    

    public List<QuestionUnit1> getAllQuestions1(String tname, String lname)
    
        List<QuestionUnit1> quesList1 = new ArrayList<QuestionUnit1>();
        String selectQuery1 = "SELECT * FROM " + tname+" WHERE "+KEY_CAT+" = '"+lname+"'";
        dbase=this.getReadableDatabase();
        Cursor cursor = dbase.rawQuery(selectQuery1, null);
        // looping through all rows and adding to list
        if (cursor.moveToFirst()) 
            do 
                QuestionUnit1 quest1 = new QuestionUnit1();
                quest1.setID1(cursor.getInt(0));
                quest1.setQUESTION1(cursor.getString(1));
                quest1.setANSWER1(cursor.getString(2));
                quest1.setOPTA1(cursor.getString(3));
                quest1.setOPTB1(cursor.getString(4));
                quest1.setOPTC1(cursor.getString(5));
                quest1.setOPTD1(cursor.getString(6));
                quesList1.add(quest1);
             while (cursor.moveToNext());
        
        return quesList1;
    // end pubic list

代码像按钮一样移动到锻炼活动

if(position == 2)
                    Intent i= new Intent(getApplicationContext(),Unit1ExerciseActivity.class);
                    i.putExtra("table_name",tableName);
                    i.putExtra("level_name","B");
                    startActivity(i);
                    overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
                

而练习Activity中的代码是

public class Unit1ExerciseActivity extends AppCompatActivity 
    List<QuestionUnit1> quesList1;
    public int score=0;
    int ctr1=1;
    QuestionUnit1 currentQ1;
    TextView txtQuestion1;
    RadioGroup grp;
    RadioButton rda1, rdb1, rdc1, rdd1;
    Button butNext1;
    Random random1 = new Random();
    ArrayList<Integer> list = new ArrayList<Integer>();
    TextView textViewTime1;
    public ArrayList<String> wrongQuestListUnit1 = new ArrayList<String>();
    public ArrayList<String> selectedAnsUnit1 = new ArrayList<String>();
    public ArrayList<String> actualAnswerUnit1 = new ArrayList<String>();
    int number;
    ProgressBar progressBar;
    int progress = 1;
    String tableName="",catName="";
    TextView qstnNo;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.unit1_exercise_activity);


        qstnNo = (TextView)findViewById(R.id.qstnNo);

        Intent iin=getIntent();
        Bundle b=iin.getExtras();

        if(b!=null)
            tableName=(String)b.get("table_name");
            catName=(String)b.get("level_name");
            Log.d("Table Name",tableName);
            Log.d("Level Name",catName);
        
        number=0;
        DbHelper db= new DbHelper(this);
        textViewTime1 = (TextView)findViewById(R.id.textViewTime);
        final CounterClass timer = new CounterClass(1800000, 1000);
        timer.start();

        quesList1=db.getAllQuestions1(tableName,catName);
        for(int i=0;i<50;i++)
            while(true)
                int next = random1.nextInt(50);
                if(!list.contains(next))
                
                    list.add(next);
                    break;
                
            
        
        currentQ1=quesList1.get(list.get(0));
        txtQuestion1=(TextView)findViewById(R.id.textView1);
        rda1=(RadioButton)findViewById(R.id.radio0);
        rdb1=(RadioButton)findViewById(R.id.radio1);
        rdc1=(RadioButton)findViewById(R.id.radio2);
        rdd1=(RadioButton)findViewById(R.id.radio3);
        butNext1=(Button)findViewById(R.id.button1);
        setQuestionView();
        grp = (RadioGroup) findViewById(R.id.radioGroup1);
        butNext1.setEnabled(false);
        grp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) 
                if(i== R.id.radio0 || i == R.id.radio1 || i==R.id.radio2 || i == R.id.radio3)
                    butNext1.setEnabled(true);
            
        );
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        progressBar.setMax(30);
        progressBar.setProgress(1);
        butNext1.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                progress = progress+1;
                progressBar.setProgress(progress);
                RadioButton answer = (RadioButton) findViewById(grp.getCheckedRadioButtonId());
                //Log.d("yourans", currentQ1.getANSWER1() + " " + answer.getText());
                if (currentQ1.getANSWER1().equals(answer.getText())) 
                    score++;
                    //Log.d("score", "Your score" + score1);
                
                else
                
                    wrongQuestListUnit1.add(number, currentQ1.getQUESTION1());
                    selectedAnsUnit1.add(number, answer.getText().toString());
                    actualAnswerUnit1.add(number, currentQ1.getANSWER1());
                    number++;
                
                grp.clearCheck();
                butNext1.setEnabled(false);
                if (ctr1 < 31) 
                    if (ctr1 == 30) 
                        butNext1.setText("End Test");
                    
                    currentQ1 = quesList1.get(list.get(ctr1));
                    setQuestionView();
                 else 
                    timer.onFinish();
                    timer.cancel();
                
            
        );

    

    public class CounterClass extends CountDownTimer 
        public CounterClass(long millisInFuture, long countDownInterval) 
            super(millisInFuture, countDownInterval);
        

        @Override
        public void onTick(long millisUntilFinished) 
            long millis = millisUntilFinished;
            String hms = String.format("%02d:%02d",
                    TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                    TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
            textViewTime1.setText(hms);
        

        @Override
        public void onFinish() 
            showResult();
        
    

    public void showResult()
        Intent intent = new Intent(Unit1ExerciseActivity.this, ResultActivity.class);
        Bundle b = new Bundle();
        b.putInt("scoreUnit1 ", score);//Your score
        b.putString("section",tableName);//Your table name
        b.putString("category",catName);//Your category name
        intent.putStringArrayListExtra("wrongQuestions", wrongQuestListUnit1);
        intent.putStringArrayListExtra("selectedAnswer", selectedAnsUnit1);
        intent.putStringArrayListExtra("actualAnswer", actualAnswerUnit1);
        intent.putExtras(b); //Put your score to your next Intent
        startActivity(intent);
        finish();
    

    private void setQuestionView()
        txtQuestion1.setText(currentQ1.getQUESTION1());
        rda1.setText(currentQ1.getOPTA1());
        rdb1.setText(currentQ1.getOPTB1());
        rdc1.setText(currentQ1.getOPTC1());
        rdd1.setText(currentQ1.getOPTD1());
        if(ctr1<10)
            qstnNo.setText("0" + ctr1 + "/30");
        else
            qstnNo.setText("" + ctr1+ "/30");
        ctr1++;
    

    @Override
    public void onBackPressed() 
        //super.onBackPressed();
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //Uncomment the below code to Set the message and title from the strings.xml file
        //builder.setMessage(R.string.dialog_message) .setTitle(R.string.dialog_title);

        //Setting message manually and performing action on button click
        builder.setMessage("If you close all your progress would not be saved... Do you wish to exit ?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
                    public void onClick(DialogInterface dialog, int id) 
                        finish();
                    
                )
                .setNegativeButton("No", new DialogInterface.OnClickListener() 
                    public void onClick(DialogInterface dialog, int id) 
                        //  Action for 'NO' Button
                        dialog.cancel();
                    
                );

        //Creating dialog box
        AlertDialog alert = builder.create();
        //Setting the title manually
        // alert.setTitle("CompQuiz");
        alert.show();
    

【问题讨论】:

这能回答你的问题吗? SQLite DataBase Read Error 'no such file or directory ' Manjeet Brar,情况不同,我找不到解决方案 调试并检查这一行:i.putExtra("table_name",tableName);变量tableName的值。 【参考方案1】:

您可能正在传递/获取空表名。

试试这个:

    if(b!=null)
        tableName=b.getString("table_name");
        catName=b.getString("level_name");
        Log.d("Table Name",tableName);
        Log.d("Level Name",catName);
    

【讨论】:

效果不太好,如果您有其他建议,我不胜感激 你的 logcat 打印什么 Log.d("Table name",tableName); ??【参考方案2】:

请试试这个:

public void addQuestionsUnit1(QuestionUnit1 quest)

SQLiteDatabase db = getWritableDatabase();

db.beginTransaction();
try 
ContentValues values = new ContentValues();
values.put(KEY_QUES, quest.getQUESTION1());
values.put(KEY_ANSWER, quest.getANSWER1());
values.put(KEY_OPTA, quest.getOPTA1());
values.put(KEY_OPTB, quest.getOPTB1());
values.put(KEY_OPTC, quest.getOPTC1());
values.put(KEY_OPTD, quest.getOPTD1());
values.put(KEY_CAT,quest.getCATEGORY1());
// Inserting Row
dbase.insert(TABLE_QUEST1, null, values);
db.setTransactionSuccessful();
 catch (Exception e) 
        Log.d("DB insertion", "Error while trying to add values to database");
     finally 
        db.endTransaction();
    




@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 



public List<QuestionUnit1> getAllQuestions1(String tname, String lname)

    List<QuestionUnit1> quesList1 = new ArrayList<QuestionUnit1>();
    String selectQuery1 = "SELECT * FROM " + tname+" WHERE "+KEY_CAT+" = '"+lname+"'";
    dbase= getReadableDatabase();
    Cursor cursor = dbase.rawQuery(selectQuery1, null);
    // looping through all rows and adding to list
    if (cursor.moveToFirst()) 
        do 
            QuestionUnit1 quest1 = new QuestionUnit1();
            quest1.setID1(cursor.getInt(0));
            quest1.setQUESTION1(cursor.getString(1));
            quest1.setANSWER1(cursor.getString(2));
            quest1.setOPTA1(cursor.getString(3));
            quest1.setOPTB1(cursor.getString(4));
            quest1.setOPTC1(cursor.getString(5));
            quest1.setOPTD1(cursor.getString(6));
            quesList1.add(quest1);
         while (cursor.moveToNext());
    
    cursor.close();
    return quesList1;


【讨论】:

以上是关于android.database.sqlite.SQLiteException:靠近“WHERE”:语法错误(Sqlite 代码 1)的主要内容,如果未能解决你的问题,请参考以下文章