Reputation: 81
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
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