0

I am trying to load my SQLite data into listview. but my application stops when the database retireval activity is called.

This is my Logcat

03-02 11:05:04.488: I/dalvikvm(24942): threadid=3: reacting to signal 3
03-02 11:05:04.579: I/dalvikvm(24942): Wrote stack traces to '/data/anr/traces.txt'
03-02 11:05:04.898: I/dalvikvm(24942): threadid=3: reacting to signal 3
03-02 11:05:04.918: I/dalvikvm(24942): Wrote stack traces to '/data/anr/traces.txt'
03-02 11:05:05.118: D/gralloc_goldfish(24942): Emulator without GPU emulation detected.
03-02 11:05:06.978: D/AndroidRuntime(24942): Shutting down VM
03-02 11:05:06.978: W/dalvikvm(24942): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
03-02 11:05:07.048: E/AndroidRuntime(24942): FATAL EXCEPTION: main
03-02 11:05:07.048: E/AndroidRuntime(24942): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.grammer/com.example.grammer.Database}: java.lang.IllegalArgumentException: column '_id' does not exist
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.os.Looper.loop(Looper.java:137)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.app.ActivityThread.main(ActivityThread.java:4424)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at java.lang.reflect.Method.invokeNative(Native Method)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at java.lang.reflect.Method.invoke(Method.java:511)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at dalvik.system.NativeStart.main(Native Method)
03-02 11:05:07.048: E/AndroidRuntime(24942): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:267)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.widget.CursorAdapter.init(CursorAdapter.java:168)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.widget.CursorAdapter.<init>(CursorAdapter.java:145)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:91)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:104)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at com.example.grammer.Database.displayListView(Database.java:81)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at com.example.grammer.Database.onCreate(Database.java:38)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.app.Activity.performCreate(Activity.java:4465)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-02 11:05:07.048: E/AndroidRuntime(24942):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
03-02 11:05:07.048: E/AndroidRuntime(24942):    ... 11 more
03-02 11:05:07.178: I/dalvikvm(24942): threadid=3: reacting to signal 3
03-02 11:05:07.199: I/dalvikvm(24942): Wrote stack traces to '/data/anr/traces.txt'
03-02 11:05:07.678: I/dalvikvm(24942): threadid=3: reacting to signal 3
03-02 11:05:07.698: I/dalvikvm(24942): Wrote stack traces to '/data/anr/traces.txt'
03-02 11:05:08.099: I/dalvikvm(24942): threadid=3: reacting to signal 3
03-02 11:05:08.109: I/dalvikvm(24942): Wrote stack traces to '/data/anr/traces.txt'
03-02 11:05:09.149: I/Process(24942): Sending signal. PID: 24942 SIG: 9

The activity which is called is Database activity. This is as follows.

public class Database extends Activity {


     private DatabaseHandler dbHelper;
     private SimpleCursorAdapter dataAdapter;



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.exercise);


        dbHelper = new DatabaseHandler(this);
        dbHelper.open();

        displayListView();

    }


    private void displayListView() {

        Cursor cursor = dbHelper.fetchQuestions();

        // The desired columns to be bound
          String[] columns = new String[] {
                  DatabaseHandler.KEY_ROWID,
                  DatabaseHandler.KEY_NAME,
                  DatabaseHandler.KEY_TITLE,
                  DatabaseHandler.KEY_ANSWER1,
                  DatabaseHandler.KEY_ANSWER2,
                  DatabaseHandler.KEY_ANSWER3,
                  DatabaseHandler.KEY_ANSWER4,
                  DatabaseHandler.KEY_ANSWER,
                  DatabaseHandler.KEY_ANSWER_TEXT
              };


        // the XML defined views which the data will be bound to
          int[] to = new int[] { 
                    R.id.id,
                    R.id.title,
                    R.id.question,
                    R.id.ans1,
                    R.id.ans2,
                    R.id.ans3,
                    R.id.ans4,
                    R.id.ans,
                    R.id.ansnum,
                  };

        // create the adapter using the cursor pointing to the desired data 
          //as well as the layout information
          dataAdapter = new SimpleCursorAdapter(
            this, R.layout.questions_info, 
            cursor, 
            columns, 
            to,
            0);


          ListView listView = (ListView) findViewById(R.id.listView1);
          // Assign adapter to ListView
          listView.setAdapter(dataAdapter);

          listView.setOnItemClickListener(new OnItemClickListener() {
               @Override
               public void onItemClick(AdapterView<?> listView, View view, 
                 int position, long id) {
               // Get the cursor, positioned to the corresponding row in the result set
               Cursor cursor = (Cursor) listView.getItemAtPosition(position);

               // Get the state's capital from this row in the database.
               String question = 
                cursor.getString(cursor.getColumnIndexOrThrow("code"));
               Toast.makeText(getApplicationContext(),
                       question, Toast.LENGTH_SHORT).show();

               }
              });


         }
        }

My database handler class

public class DatabaseHandler{

    // Contacts Table Columns names
     static final String KEY_ROWID = "id";
     static final String KEY_NAME = "questions";
    static final String KEY_TITLE = "question_title";
    public static final String KEY_ANSWER1 = "answer1";
    public static final String KEY_ANSWER2 = "answer2";
    public static final String KEY_ANSWER3 = "answer3";
    public static final String KEY_ANSWER4 = "answer4";
    public static final String KEY_ANSWER = "answer";
    public static final String KEY_ANSWER_TEXT = "answer_text";

    private static final String TAG = "DatabaseHandler";
     private DatabaseHelper mDbHelper;
     private SQLiteDatabase mDb;

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = "grammer";
    // Contacts table name
    private static final String TABLE_QUESTIONS = "questions";

     private final Context mCtx;

     private static final String DATABASE_CREATE =
              "CREATE TABLE if not exists " + TABLE_QUESTIONS + "("
                        + KEY_ROWID +" integer PRIMARY KEY autoincrement," + KEY_NAME + " TEXT,"
                        + KEY_ANSWER1 + " TEXT," + KEY_ANSWER2 + " TEXT," + KEY_ANSWER3 + " TEXT," 
                        + KEY_ANSWER4 + " TEXT," + KEY_ANSWER + " TEXT," + KEY_TITLE + " TEXT," + KEY_ANSWER_TEXT + " TEXT" +")";;



    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
               super(context, DATABASE_NAME, null, DATABASE_VERSION);
              }

        @Override
          public void onCreate(SQLiteDatabase db) {
           Log.w(TAG, DATABASE_CREATE);
           db.execSQL(DATABASE_CREATE);
          }

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
               Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                 + newVersion + ", which will destroy all old data");
               db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUESTIONS);
               onCreate(db);
              }

    }

    public DatabaseHandler(Context ctx) {
          this.mCtx = ctx;
         }


    public DatabaseHandler open() throws SQLException {
          mDbHelper = new DatabaseHelper(mCtx);
          mDb = mDbHelper.getWritableDatabase();
          return this;
         }


    public void close() {
          if (mDbHelper != null) {
           mDbHelper.close();
          }
         }


    public long addQuestion(String Question, String Answer1, String Answer2, String Answer3, String Answer4, String Answer, String Answer_Text, String Question_Title) {

        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_NAME, Question); // question Name
        initialValues.put(KEY_ANSWER1, Answer1); // answer
        initialValues.put(KEY_ANSWER2, Answer2); // answer
        initialValues.put(KEY_ANSWER3, Answer3); // answer
        initialValues.put(KEY_ANSWER4, Answer4); // answer
        initialValues.put(KEY_ANSWER, Answer); // answer
        initialValues.put(KEY_ANSWER_TEXT, Answer_Text);
        initialValues.put(KEY_TITLE, Question_Title);

              return mDb.insert(TABLE_QUESTIONS, null, initialValues);
             }


    public boolean deleteAllQuestions() {

          int doneDelete = 0;
          doneDelete = mDb.delete(TABLE_QUESTIONS, null , null);
          Log.w(TAG, Integer.toString(doneDelete));
          return doneDelete > 0;

         }



     public Cursor fetchQuestions() {


         Cursor mCursor = mDb.query(TABLE_QUESTIONS, new String[] {KEY_ROWID,
                    KEY_NAME, KEY_ANSWER1, KEY_ANSWER2, KEY_ANSWER3, KEY_ANSWER4, KEY_ANSWER, KEY_ANSWER_TEXT, KEY_TITLE }, 
                    null, null, null, null, null);       


          if (mCursor != null) {
           mCursor.moveToFirst();
          }
          return mCursor;

         }

}

My .xml page.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="6dip" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="ID: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:text="Question Title: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_below="@+id/textView2"
        android:text="Question: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView3"
        android:layout_below="@+id/textView3"
        android:text="Answer1: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView4"
        android:layout_below="@+id/textView4"
        android:text="Answer2: "
        android:textAppearance="?android:attr/textAppearanceMedium" />


        <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView5"
        android:layout_below="@+id/textView5"
        android:text="Answer3: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
        android:id="@+id/textView7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView6"
        android:layout_below="@+id/textView6"
        android:text="Answer4: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
        android:id="@+id/textView9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView10"
        android:layout_below="@+id/textView10"
        android:text="Answer Number: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

         <TextView
        android:id="@+id/textView10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView7"
        android:layout_below="@+id/textView7"
        android:text="Correct Answer: "
        android:textAppearance="?android:attr/textAppearanceMedium" />


  <TextView
        android:id="@+id/id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView1"
        android:layout_alignBottom="@+id/textView1"
        android:layout_toRightOf="@+id/textView1"
        android:text="TextViewid" />

  <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView2"
        android:layout_alignBottom="@+id/textView2"
        android:layout_toRightOf="@+id/textView2"
        android:text="TextViewtitle" />


    <TextView
        android:id="@+id/question"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/textView3"
        android:layout_toRightOf="@+id/textView3"
        android:text="TextViewQuestion" />


   <TextView
        android:id="@+id/ans1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView4"
        android:layout_alignBottom="@+id/textView4"
        android:layout_toRightOf="@+id/textView4"
        android:text="TextViewAns1" />


 <TextView
        android:id="@+id/ans2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView6"
        android:layout_alignRight="@+id/ans1"
        android:text="TextViewans2" />

    <TextView
        android:id="@+id/ans3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView6"
        android:layout_alignBottom="@+id/textView6"
        android:layout_alignLeft="@+id/question"
        android:text="TextViewAns3" />

    <TextView
        android:id="@+id/ans4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView7"
        android:layout_alignBottom="@+id/textView7"
        android:layout_alignLeft="@+id/ans3"
        android:text="TextViewAns4" />


   <TextView
        android:id="@+id/ans"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textView10"
        android:layout_alignLeft="@+id/ansnum"
        android:text="TextViewcorrectans" />



    <TextView
        android:id="@+id/ansnum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView9"
        android:layout_alignBottom="@+id/textView9"
        android:layout_alignParentRight="true"
        android:text="TextViewcorrectansnumber" />

</RelativeLayout>

I can figure out that the code logcat says something about _id which I cannot find.

2 Answers 2

1

Quoting docs

The Cursor must include a column named "_id" or this class will not work. Additionally, using MergeCursor with this class will not work if the merged Cursors have overlapping values in their "_id" columns.

http://developer.android.com/reference/android/widget/CursorAdapter.html

Change this

static final String KEY_ROWID = "id";

to

static final String KEY_ROWID = "_id";
Sign up to request clarification or add additional context in comments.

2 Comments

It would be better to use BaseColumns._ID rather than define your own version of this constant.
@Dobbo yes. i guess there is a example of the same with loaders. developer.android.com/reference/android/provider/…. gotta check the docs
0

Here you have used SimpleCursorAdapter. for using simple cursor adapter you must have a column named _id in your query. Otherwise SimpleCursorAdapter will not work.

So it is better you use your own CustomCursorAdapter.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.