Nirvan
Nirvan

Reputation: 81

How to write query statement for SQLite Database?

I'm implementing an SQLite database. In the database I'm storing objects of type Contact whose definition is below. The method getContact() is supposed to take an id and return the corresponding Contact object in the database. But this isn't working. When I debug it, the control is getting stuck on the line, after which the app crashed.

  Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                    KEY_NAME_DEFAULT,KEY_NAME,KEY_IMAGE}, KEY_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);

I have a very basic understanding of SQLite and can't figure out what's wrong here. Please help.

Contact class

package com.example.nirvan.diary30;

import android.graphics.Bitmap;

public class Contact
{
String nameDefault;
public String name[];
public Bitmap image[];
public int id;

Contact(int id, String name,String arrName[],Bitmap arrImage[])
{
    this.id=id;
    this.nameDefault=name;
    this.name=arrName;
    this.image=arrImage;
}

}

getContact() in DatabaseHandler.java

Contact getContact(int id)
{
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                    KEY_NAME_DEFAULT,KEY_NAME,KEY_IMAGE}, KEY_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();


    Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1) ,convertStringToArray(cursor.getString(2)) , backConverter(cursor.getString(3)));

    return contact;
}

UPDATE: Log

 FATAL EXCEPTION: main
                                                                      Process: com.example.nirvan.diary30, PID: 6937
                                                                      android.database.sqlite.SQLiteException: no such column: image (code 1): , while compiling: SELECT id, nameDefault, name, image FROM contacts WHERE id=?
                                                                          at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                          at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
                                                                          at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
                                                                          at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                                          at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                          at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                                                                          at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                                                                          at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
                                                                          at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
                                                                          at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
                                                                          at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1238)
                                                                          at com.example.nirvan.diary30.DatabaseHandler.getContact(DatabaseHandler.java:136)
                                                                          at com.example.nirvan.diary30.MainActivity$1.onPageSelected(MainActivity.java:87)
                                                                          at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1933)
                                                                          at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:685)
                                                                          at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:669)
                                                                          at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:630)
                                                                          at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:611)
                                                                          at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2156)
                                                                          at android.support.design.widget.TabLayout.dispatchTabSelected(TabLayout.java:1138)
                                                                          at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1132)
                                                                          at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1105)
                                                                          at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1396)
                                                                          at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1501)
                                                                          at android.view.View$PerformClick.run(View.java:18465)
                                                                          at android.os.Handler.handleCallback(Handler.java:733)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                          at android.os.Looper.loop(Looper.java:136)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:5086)
                                                                          at java.lang.reflect.Method.invokeNative(Native Method)
                                                                          at java.lang.reflect.Method.invoke(Method.java:515)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
                                                                          at dalvik.system.NativeStart.main(Native Method)

Upvotes: 0

Views: 306

Answers (1)

amrabed
amrabed

Reputation: 866

Your query() statement looks fine. You need to check that cursor.moveToFirst() returned true though. It returns false if the cursor is empty. See here for more details

Try this:

if (cursor.moveToFirst())
{
   Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), 
            convertStringToArray(cursor.getString(2)),
            backConverter(cursor.getString(3)));
}
else
{
    // not found
}

Upvotes: 1

Related Questions