Please go through the entire question :
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.
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 :
10-22 14:02:55.694: D/dalvikvm(2019): GC_FOR_ALLOC freed 99K, 6% free 3265K/3452K, paused 46ms, total 48ms
10-22 14:02:56.274: D/gralloc_goldfish(2019): Emulator without GPU emulation detected.
10-22 14:03:34.184: W/IInputConnectionWrapper(2019): showStatusIcon on inactive InputConnection
10-22 14:03:51.654: D/AndroidRuntime(2019): Shutting down VM
10-22 14:03:51.654: W/dalvikvm(2019): threadid=1: thread exiting with uncaught exception (group=0xb1a7dba8)
10-22 14:03:51.854: D/dalvikvm(2019): GC_FOR_ALLOC freed 129K, 6% free 3647K/3856K, paused 125ms, total 142ms
10-22 14:03:51.904: E/AndroidRuntime(2019): FATAL EXCEPTION: main
10-22 14:03:51.904: E/AndroidRuntime(2019): Process: course.examples.jumboquest, PID: 2019
10-22 14:03:51.904: E/AndroidRuntime(2019): java.lang.RuntimeException: Unable to start activity ComponentInfo{course.examples.jumboquest/course.examples.jumboquest.DBHelperDisplay}: android.database.sqlite.SQLiteException: Can't downgrade database from version 3 to 2
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.os.Handler.dispatchMessage(Handler.java:102)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.os.Looper.loop(Looper.java:136)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.app.ActivityThread.main(ActivityThread.java:5017)
10-22 14:03:51.904: E/AndroidRuntime(2019): at java.lang.reflect.Method.invokeNative(Native Method)
10-22 14:03:51.904: E/AndroidRuntime(2019): at java.lang.reflect.Method.invoke(Method.java:515)
10-22 14:03:51.904: E/AndroidRuntime(2019): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
10-22 14:03:51.904: E/AndroidRuntime(2019): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
10-22 14:03:51.904: E/AndroidRuntime(2019): at dalvik.system.NativeStart.main(Native Method)
10-22 14:03:51.904: E/AndroidRuntime(2019): Caused by: android.database.sqlite.SQLiteException: Can't downgrade database from version 3 to 2
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.database.sqlite.SQLiteOpenHelper.onDowngrade(SQLiteOpenHelper.java:361)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:255)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
10-22 14:03:51.904: E/AndroidRuntime(2019): at course.examples.jumboquest.DBHelperDisplay$DBHelper.insertQuestion(DBHelperDisplay.java:158)
10-22 14:03:51.904: E/AndroidRuntime(2019): at course.examples.jumboquest.DBHelperDisplay.onCreate(DBHelperDisplay.java:46)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.app.Activity.performCreate(Activity.java:5231)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-22 14:03:51.904: E/AndroidRuntime(2019): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
10-22 14:03:51.904: E/AndroidRuntime(2019): ... 11 more
10-22 14:04:00.984: I/Process(2019): Sending signal. PID: 2019 SIG: 9
I posted the question on the link
I got thee reply to uninstall and install the app again. Although it removed the error but then it gave me another error :
10-22 07:43:43.644: D/dalvikvm(1955): GC_FOR_ALLOC freed 96K, 6% free 3265K/3448K, paused 42ms, total 48ms
10-22 07:43:44.164: D/gralloc_goldfish(1955): Emulator without GPU emulation detected.
10-22 07:43:52.554: D/AndroidRuntime(1955): Shutting down VM
10-22 07:43:52.554: W/dalvikvm(1955): threadid=1: thread exiting with uncaught exception (group=0xb1a7dba8)
10-22 07:43:52.684: E/AndroidRuntime(1955): FATAL EXCEPTION: main
10-22 07:43:52.684: E/AndroidRuntime(1955): Process: course.examples.jumboquest, PID: 1955
10-22 07:43:52.684: E/AndroidRuntime(1955): java.lang.RuntimeException: Unable to start activity ComponentInfo{course.examples.jumboquest/course.examples.jumboquest.DBHelperDisplay}: java.lang.NullPointerException
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.os.Handler.dispatchMessage(Handler.java:102)
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.os.Looper.loop(Looper.java:136)
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.app.ActivityThread.main(ActivityThread.java:5017)
10-22 07:43:52.684: E/AndroidRuntime(1955): at java.lang.reflect.Method.invokeNative(Native Method)
10-22 07:43:52.684: E/AndroidRuntime(1955): at java.lang.reflect.Method.invoke(Method.java:515)
10-22 07:43:52.684: E/AndroidRuntime(1955): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
10-22 07:43:52.684: E/AndroidRuntime(1955): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
10-22 07:43:52.684: E/AndroidRuntime(1955): at dalvik.system.NativeStart.main(Native Method)
10-22 07:43:52.684: E/AndroidRuntime(1955): Caused by: java.lang.NullPointerException
10-22 07:43:52.684: E/AndroidRuntime(1955): at course.examples.jumboquest.DBHelperDisplay.onCreate(DBHelperDisplay.java:70)
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.app.Activity.performCreate(Activity.java:5231)
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-22 07:43:52.684: E/AndroidRuntime(1955): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
10-22 07:43:52.684: E/AndroidRuntime(1955): ... 11 more
10-22 07:43:59.064: I/Process(1955): Sending signal. PID: 1955 SIG: 9
I tried searching on Google and found Stack Overflow links for the same problem and got some solutions which I tried but none of them worked. Also, every time I run the app again on emulator with changes, I have to uninstall the previous version of it and then install it again. Otherwise, it shows me the same first error and if the first error is rectified then it shows me the second error.
I have tried many things but nothing is working. Please help me. I am new to the SQLite in Android.