1

I want to develop an application in which i need to use SQLite database in Android. Below is the code shown which is implementing the database and all its operations my application requires with random data(just to implement the logic successfully first).

This code is written in DBHelperDisplay.java which is called through intent by MainActivity.java.

My DBHelperDisplay.java :

package course.examples.jumboquest;

import java.util.Random;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
//import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
//import android.content.Intent;
import android.os.CountDownTimer;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;

public class DBHelperDisplay extends ActionBarActivity {

TextView tv; 
DBHelper myDB;
RadioGroup radioChoices;
RadioButton rbtChoice; 
Button btSubmit;
String choice1;
String choice2;
String choice3;
String choice4;
String strAns;
CustomTimer cdt;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dbhelper_display);

    cdt = new CustomTimer(20000, 1000);
    cdt.start();

    myDB = new DBHelper(this);

    myDB.insertQuestion(1, "who is the team member whose name starts with s?", "Vinita", "Akanksha", "Swati", "Megha", "Swati");
    myDB.insertQuestion(2, "who is the team member whose name starts with m?", "Vinita", "Akanksha", "Swati", "Megha", "Megha");
    myDB.insertQuestion(3, "who is the team member whose name starts with a?", "Vinita", "Akanksha", "Swati", "Megha", "Akanksha");
    myDB.insertQuestion(4, "who is the team member whose name starts with v?", "Vinita", "Akanksha", "Swati", "Megha", "Vinita");
    myDB.insertQuestion(5, "who is the team member whose name ends with i?", "Vinita", "Akanksha", "Swati", "Megha", "Swati");

    Cursor rs = myDB.getData();
    String Question = rs.getString(rs.getColumnIndex(DBHelper.Col_Ques));
    choice1 = rs.getString(rs.getColumnIndex(DBHelper.Col_Choice1));
    choice2 = rs.getString(rs.getColumnIndex(DBHelper.Col_Choice2));
    choice3 = rs.getString(rs.getColumnIndex(DBHelper.Col_Choice3));
    choice4 = rs.getString(rs.getColumnIndex(DBHelper.Col_Choice4));
    strAns = rs.getString(rs.getColumnIndex(DBHelper.Col_Ans));


    tv = (TextView) findViewById(R.id.timertxt);

    final TextView quest = (TextView) findViewById(R.id.quest);
    quest.setText(Question);

    //final TextView ans = (TextView) findViewById(R.id.ans);

    Button btClear = (Button)findViewById(R.id.btClear);
    btClear.setText("CLEAR");

   addListenerRadioChoices() ;

   btClear.setOnClickListener(new View.OnClickListener(){
     public void onClick(View v) {
        //ans.setText("");

       }
  });
 }
    public void addListenerRadioChoices(){ 

    radioChoices = (RadioGroup) findViewById(R.id.radioChoices);

    ((RadioButton) radioChoices.getChildAt(0)).setText(choice1); 
    ((RadioButton) radioChoices.getChildAt(1)).setText(choice2);
    ((RadioButton) radioChoices.getChildAt(2)).setText(choice3);
    ((RadioButton) radioChoices.getChildAt(3)).setText(choice4);

    btSubmit = (Button)findViewById(R.id.btSubmit); 
    btSubmit.setText("SUBMIT");
    btSubmit.setOnClickListener(new View.OnClickListener(){
     public void onClick(View v) {

        int selected = radioChoices.getCheckedRadioButtonId();
        rbtChoice = (RadioButton) findViewById(selected); 
        String Ans = rbtChoice.getText().toString();
         if(Ans.equalsIgnoreCase(strAns)){

            cdt.cancel();
            //ans.setText(" ANSWER");

         }
        /* else{
            //  ans.setText("WRONG ANSWER");
         }*/

    }
   });
  } 

public class CustomTimer extends CountDownTimer{
    //TextView ed;
    public CustomTimer(long millisInFuture, long countDownInterval){
        super(millisInFuture, countDownInterval);
    }
    @Override
    public void onTick(long millisUntilFinished){
        //current = millisUntilFinished/1000;
        tv.setText("Time Left:" + millisUntilFinished/1000);
    }
    @Override
    public void onFinish() {
        tv.setText("Time Up - lost the game!");
    }
}

public class DBHelper extends SQLiteOpenHelper {

    public static final String Database_Name = "Questions.db"; 
    public static final String Table_Name = "Comics"; 
    public static final String Col_ID = "id"; 
    public static final String Col_Ques = "question"; 
    public static final String Col_Choice1 = "choice1"; 
    public static final String Col_Choice2 = "choice2"; 
    public static final String Col_Choice3 = "choice3"; 
    public static final String Col_Choice4 = "choice4"; 
    public static final String Col_Ans = "answer"; 

    public DBHelper(Context context){
        super(context, Database_Name, null, 1);
    }
    @Override 
    public void onCreate(SQLiteDatabase db){
        // TODO Auto-generated method stub  
       db.execSQL(
       "CREATE TABLE Comics" +
       "(id integer primary key, question text, choice1 text, choice2 text, choice3 text, choice4 text, answer text)");

    }   
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          // TODO Auto-generated method stub
          db.execSQL("DROP TABLE IF EXISTS Comics");
          onCreate(db);
    }

    public boolean insertQuestion(int id, String question, String choice1, String choice2, String choice3, String choice4, String answer){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();

        contentValues.put("id",id);
        contentValues.put("question",question);
        contentValues.put("choice1",choice1);
        contentValues.put("choice2",choice2);
        contentValues.put("choice3",choice3);
        contentValues.put("choice4",choice4);
        contentValues.put("answer",answer);
        db.insert("Comics", null, contentValues);
        db.close();
        return true;
    }
    public Cursor getData(){
        SQLiteDatabase db = this.getReadableDatabase();
        int numRows = (int)DatabaseUtils.queryNumEntries(db,Table_Name);
        int min = 1;
        int max = numRows;
        Random r = new Random();
        int id = r.nextInt(max - min + 1) + min;
        Cursor res= db.rawQuery("Select * from Comics where id = " + id + "", null);
        return res;
    }
}

}

My AndroidManifest.xml file :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="course.examples.jumboquest"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="21" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".DBHelperDisplay"></activity>
</application>

</manifest>

On executing the above code, I am getting the following error :

logcat file

I have searched a lot and found many stack overflow links with same problem but still it is not resolved. I am new to this topic. Please help me.

logCat file2

POOJA GUPTA
  • 2,295
  • 7
  • 32
  • 60
  • 1
    Uninstall and reinstall the app to get rid of a possible old version of the database file. http://stackoverflow.com/questions/21881992/when-is-sqliteopenhelper-oncreate-onupgrade-run – laalto Oct 22 '14 at 10:29
  • 1
    Before uninstalling, make sure to clear data. :) – MysticMagicϡ Oct 22 '14 at 10:32
  • 1
    @MysticMagic Uninstalling is perhaps the most straightforward way to clear data. Clear data alone works, too, but needs longer explanation. – laalto Oct 22 '14 at 10:34
  • @laalto : i have to uninstall the app as many times as I want to run my app. Is there any solution. and if the app works fine after one iteration of uninstalling and installing then it gives me error of Unable to start Activity Component info. Do you have any other solution. – POOJA GUPTA Oct 22 '14 at 11:51
  • You need to upgrade/recreate the database only when you've changed the schema. Seems like you have another problem - you can post a new question about it. Please post your exception stacktrace as text and not as images. – laalto Oct 22 '14 at 11:52
  • @laalto : i have posted a new question as suggested by you. Can you see that now please? – POOJA GUPTA Oct 22 '14 at 12:32

1 Answers1

3

I have had two adapters :

public class DBController_for_drivinglicense extends SQLiteOpenHelper {

public DBController_for_drivinglicense(Context applicationcontext) {
    super(applicationcontext,"nozadb", null, 1);

}
//Creates Table
@Override
public void onCreate(SQLiteDatabase database) {

    String query;
    query = "CREATE TABLE if not exists drivinglicense ( id INTEGER PRIMARY KEY, comment TEXT,rates float,names TEXT,date DEFAULT CURRENT_TIMESTAMP, udpateStatus TEXT)";
    database.execSQL(query);
}

first adapter was :

public DBController_for_landregistration(Context applicationcontext) {
    super(applicationcontext,"nozadb", null, 1);
}

@Override
public void onCreate(SQLiteDatabase database) {
    String query;

    query = "CREATE TABLE if not exists landregistration ( id INTEGER PRIMARY KEY, comment TEXT,rates float,names TEXT,date DEFAULT CURRENT_TIMESTAMP, udpateStatus TEXT)";
    database.execSQL(query);

}

And when i changed the second one to :

public class DBController_for_drivinglicense extends SQLiteOpenHelper {

public DBController_for_drivinglicense(Context applicationcontext) {
    super(applicationcontext,"nozadb", null, 2);
}
//Creates Table
@Override
public void onCreate(SQLiteDatabase database) {

    String query;
    query = "CREATE TABLE if not exists drivinglicense ( id INTEGER PRIMARY KEY, comment TEXT,rates float,names TEXT,date DEFAULT CURRENT_TIMESTAMP, udpateStatus TEXT)";
    database.execSQL(query);

}
Chris
  • 2,955
  • 1
  • 30
  • 43
nunoh123
  • 1,087
  • 1
  • 10
  • 17
  • thanks a lot, it worked :). But now it is showing NullPointerException. I don't know why. Can you just go through my code once again. – POOJA GUPTA Oct 22 '14 at 10:53
  • 1
    in what line does the nullpointerexception appears? – nunoh123 Oct 22 '14 at 10:57
  • I have uploaded image of the logcat file. I am trying to search myself too.If you can resolve it, please let me know. – POOJA GUPTA Oct 22 '14 at 11:05
  • actually the error is unable to start activity component info java.lang.RunTimeException. – POOJA GUPTA Oct 22 '14 at 11:07
  • sorry but what you suggested is not working. when I first said it worked, that is because i tried both the solutions i.e. yours and laalto's at the same time and then run my code. and it worked. But again this error is coming. when i uninstall my app as told to me by laalto and then install it again, it does not give me same error but then it gives me error 'unable to start activity component info'. do you have any other solution to this – POOJA GUPTA Oct 22 '14 at 11:49
  • that error can be any number of things xD you need to provide the the stack specifically the line that says At ("class") at line (line number) PS: you need to scroll down in the stack of the second error.. That line will tell what is hapenning – nunoh123 Oct 22 '14 at 14:39