0

I am new to SQLite Database of android I want to fetch specific data from Database but I am not able to do that It's giving me following error, I have added _id column but still it's giving the the same Exception, what could be the reason how do I solve this ? is there anything I am missing ?

java.lang.IllegalArgumentException: column '_id' does not exist at 
android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:333)
                                                                        at android.support.v4.widget.CursorAdapter.init(CursorAdapter.java:186)
                                                                        at android.support.v4.widget.CursorAdapter.<init>(CursorAdapter.java:163)
                                                                        at android.support.v4.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:99)
                                                                        at android.support.v4.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:94)
                                                                        at com.iz.PG.SummaryFragment.onCreateView(SummaryFragment.java:57)
                                                                        at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192)
                                                                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)
                                                                        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
                                                                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
                                                                        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
                                                                        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
                                                                        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
                                                                        at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
                                                                        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013)
                                                                        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
                                                                        at android.os.Handler.handleCallback(Handler.java:815)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                        at android.os.Looper.loop(Looper.java:207)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5769)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

My code is as below - DBHelper.java

    public class DBHelper extends SQLiteOpenHelper {

    // Table Name
    public static final String TABLE_NAME = "detailinfo";

    // Table columns
    public static final String id = "_id";
    public static final String param1 = "param1";
    public static final String param2 = "param2";
    public static final String param3 = "param3";
    public static final String param4 = "param4";

    // Database Information
    static final String DB_NAME = "test.db";

    // database version
    static final int DB_VERSION = 1;

    // create query
    private static final String CREATE_TABLE = "create table " + TABLE_NAME + "( "+id+" INTEGER PRIMARY KEY AUTOINCREMENT," + param1+ " TEXT, " + param2 + " TEXT,"+param3+" TEXT,"+param4+" TEXT);";

    public DBHelper(Context context) {
        super(context,DB_NAME ,null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String query = "drop table if exists"+TABLE_NAME;
        db.execSQL(query);
        onCreate(db);
    }
}

DBManager.java

    public class DBManager {

    private static final String TAG = "DBManager";

    private DBHelper dbHelper;
    private Context context;
    private SQLiteDatabase database;

    public DBManager(Context c) {
        context = c;
    }

    public DBManager open() throws SQLException {
        dbHelper = new TransactionDBHelper(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        dbHelper.close();
    }

    public void insert(TxnSummary txnSummary) {

        ContentValues contentValue = new ContentValues();        
        contentValue.put(DBHelper.param1, "1234");
        contentValue.put(DBHelper.param2, "test");
        contentValue.put(DBHelper.param3, "testdata1");
        contentValue.put(DBHelper.param4,"testdata2");

        long count = database.insert(DBHelper.TABLE_NAME, null, contentValue);
        Log.d(TAG,"Data is inserted in database count is : "+count);
    }

    public Cursor fetch() {

        String query = "SELECT "+DBHelper.param1+","
                                +DBHelper.param2+","
                                +DBHelper.param3+","
                                +DBHelper.param4
                                +" FROM "+DBHelper.TABLE_NAME;
        Cursor cursor = database.rawQuery(query,null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        return cursor;
    }
}

SummaryFragment.java

    public class SumarryFragment extends Fragment {

      final String[] from = new String[] {DBHelper.param1, Helper.param2,
DBHelper.param3,DBHelper.param4};
      final int[] to = new int[] { R.id.textViewtxnList1,
                                        R.id.textViewtxnList2,
                                            R.id.textViewtxnList3,
                                                R.id.textViewtxnList4 };

      public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View view = inflater.inflate(R.layout.fragment_txnsumarry, container, false);

            context = getContext();

            ListView txnListView = (ListView) view.findViewById(R.id.summarylistview);        

            DBManager dbManager = new DBManager(getActivity());
            dbManager.open();
            cursor = dbManager.fetch();
            simpleCursorAdapter = new SimpleCursorAdapter(getActivity(),R.layout.fragment_summary,cursor,from,to,0);
            simpleCursorAdapter.notifyDataSetChanged();
            txnListView.setAdapter(simpleCursorAdapter);

            return view;
        }
    }

and my View is

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/textViewList1"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="2dp"
            android:text="PARAM1" />
        <TextView
            android:id="@+id/textViewList2"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="PARAM2" />
        <TextView
            android:id="@+id/textViewList3"
            android:layout_width="75dp"
            android:layout_height="wrap_content"
            android:text="PARAM3" />
        <TextView
            android:id="@+id/textViewList4"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:text="PARAM4" />
    </LinearLayout>
</LinearLayout>
Shailesh
  • 657
  • 2
  • 13
  • 27

2 Answers2

0

You have to change database version in 2 or just delete and create a new db.

John K
  • 371
  • 5
  • 26
0

First, you have to ensure that the database actually contains the column (increase the DB version).

Then you also have to ensure that the query actually returns all the columns you want to read:

    String query = "SELECT "+DBHelper.param1+","
                            +DBHelper.param2+","
                            +DBHelper.param3+","
                            +DBHelper.param4
                            +" FROM "+DBHelper.TABLE_NAME;
CL.
  • 173,858
  • 17
  • 217
  • 259
  • I am using physical device, I am getting the logs about data insertion but how to view the tables on physical device ? – Shailesh Jul 31 '17 at 10:53
  • See [View contents of database file in Android Studio](https://stackoverflow.com/questions/17529766/view-contents-of-database-file-in-android-studio). – CL. Jul 31 '17 at 11:54
  • I guess that is for emulator not for physical device, thanks for your response, I changed my code little and it works fine thanks. – Shailesh Jul 31 '17 at 12:46