Rafa
Rafa

Reputation: 3349

SQLiteLog error no such table:

So I created a database, which I did wrong because of the error below, but I'm not sure what is causing the error. I know it is in my DATABASE_CREATE variable, but I don't know what I'm formatting incorrectly. Any help would be appreciated. Here is my error

06-01 19:41:11.943: E/SQLiteLog(15521): (1) no such table: YCDB
06-01 19:41:11.948: E/SQLiteDatabase(15521): Error inserting users=john password=mavsman
06-01 19:41:11.948: E/SQLiteDatabase(15521): android.database.sqlite.SQLiteException: no such table: YCDB (code 1): , while compiling: INSERT INTO YCDB(users,password) VALUES (?,?)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1118)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:691)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1589)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1461)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at yc.android.yourchallenger.DBAdapter.insertContact(DBAdapter.java:81)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at yc.android.yourchallenger.MainActivity.onCreate(MainActivity.java:27)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.app.Activity.performCreate(Activity.java:5372)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.app.ActivityThread.access$700(ActivityThread.java:168)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.os.Looper.loop(Looper.java:137)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at android.app.ActivityThread.main(ActivityThread.java:5493)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at java.lang.reflect.Method.invokeNative(Native Method)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at java.lang.reflect.Method.invoke(Method.java:525)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
06-01 19:41:11.948: E/SQLiteDatabase(15521):    at dalvik.system.NativeStart.main(Native Method)
06-01 19:41:12.188: D/libEGL(15521): loaded /system/lib/egl/libEGL_mali.so
06-01 19:41:12.193: D/libEGL(15521): loaded /system/lib/egl/libGLESv1_CM_mali.so
06-01 19:41:12.203: D/libEGL(15521): loaded /system/lib/egl/libGLESv2_mali.so
06-01 19:41:12.218: E/(15521): Device driver API match
06-01 19:41:12.218: E/(15521): Device driver API version: 23
06-01 19:41:12.218: E/(15521): User space API version: 23 
06-01 19:41:12.218: E/(15521): mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Wed Oct  9 21:05:57 KST 2013 
06-01 19:41:12.473: D/OpenGLRenderer(15521): Enabling debug mode 0

Here is the database class package yc.android.yourchallenger;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {
static final String KEY_ROWID = "id";
static final String KEY_USER = "user";
static final String KEY_PASSWORD = "password";
static final String TAG = "DBAdapter";

static final String DATABASE_NAME = "YCDB";
static final String KEY_NAME = "users";
static final int DATABASE_VERSION = 1;

static final String DATABASE_CREATE = 
        "create table contact " + KEY_USER + KEY_PASSWORD;

final Context context;

DatabaseHelper DBHelper;
SQLiteDatabase db;

public DBAdapter (Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper
{
    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {
            db.execSQL(DATABASE_CREATE);
        }
        catch(SQLException e){
            e.printStackTrace();
        }
    }

    @Override
    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 contacts");
        onCreate(db);           
    }
}

    //opens db database
    public DBAdapter open() throws SQLException
    {
        db = DBHelper.getWritableDatabase();
        return null;            
    }

    //closes the database
    public void close()
    {
        DBHelper.close();
    }

    //insert contacts
    public long insertContact(String user, String password )
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_NAME, user);
        initialValues.put(KEY_PASSWORD, password);
        return db.insert(DATABASE_NAME, null, initialValues);
    }

    //deletes contact
    /*public boolean deleteContact(long rowId)
    {
        return db.delete(DATABASE_NAME, KEY_ROWID + "+" + rowId, null) > 0;
    }

    //retrieve contacts
    public Cursor getAllContacts()
    {
        return db.query(DATABASE_NAME, new String[]{KEY_ROWID, KEY_NAME,
                KEY_PASSWORD}, null, null, null, null, null);
    }

    //retrieve specified contact
    public Cursor getContact(long rowId) throws SQLException
    {
        Cursor mCursor =
                db.query(true, DATABASE_NAME, new String[] {KEY_ROWID,
                KEY_NAME, KEY_PASSWORD}, KEY_ROWID + "=" + rowId, null,
                null, null, null, null);
        if(mCursor!= null){
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    public Boolean updatContact(long rowId, String user, String password)
    {
        ContentValues args = new ContentValues();
        args.put(KEY_USER, user);
        args.put(KEY_PASSWORD, password);
        return db.update(DATABASE_NAME, args, KEY_ROWID + "=" + rowId, null) > 0;
    }*/
}

And here is my MainActivity, just in case package yc.android.yourchallenger;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity
{
    @Override 
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button insert = (Button) findViewById(R.id.insert_contact);

    final String john = "john";
    final String pass = "mavsman";

    final DBAdapter db = new DBAdapter(this);
    db.open();
    if(db.open() == null)
    {
        Toast.makeText(this, "database not open", Toast.LENGTH_LONG).show();
    }
    db.insertContact(john, pass);
    db.close();
    insert.setOnClickListener(new View.OnClickListener() 
    {       
        @Override
        public void onClick(View arg0)
        {

        }

    }); 
}
};

Upvotes: 0

Views: 5069

Answers (2)

Phant&#244;maxx
Phant&#244;maxx

Reputation: 38098

As Code-Guru pointed out, you're inserting the data in the WRONG table.

But the CORRECT table will never be created:

This statement:

static final String DATABASE_CREATE = "create table contact " + KEY_USER + KEY_PASSWORD;

will produce the wrong command

"create table contact userpassword"

which will fail creating the table.

You need to write:

static final String DATABASE_CREATE = "create table contact (" + KEY_USER + " TEXT, " + KEY_PASSWORD + " TEXT)";

which will produce the right command:

"create table contact (user TEXT, password TEXT)"

Upvotes: 2

Code-Apprentice
Code-Apprentice

Reputation: 83557

static final String DATABASE_CREATE = 
    "create table contact " + KEY_USER + KEY_PASSWORD;

When executed, this will create a table named "contact", but you are trying to insert into a table named "YCDB". The later is the name of the database which is very different from the name of a table in that database. I suggest you create a TABLE_NAME variable to use when appropriate.

Upvotes: 1

Related Questions