I’m trying to insert some data into my SQLite database. But I keeo receiving an error code 1 saying that my column does not exist. Can someone help me please, Below is my code:
08-17 13:12:46.473: I/Database(13328): sqlite returned: error code = 1, msg = table login has no column named uid
08-17 13:12:46.503: E/Database(13328): Error inserting uid=502e7b90657ab1.86949026 created_at=2012-08-17 12:12:48 email=epaas name=hwheuu
08-17 13:12:46.503: E/Database(13328): android.database.sqlite.SQLiteException: table login has no column named uid: , while compiling: INSERT INTO login(uid, created_at, email, name) VALUES(?, ?, ?, ?);
08-17 13:12:46.503: E/Database(13328): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
08-17 13:12:46.503: E/Database(13328): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
08-17 13:12:46.503: E/Database(13328): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
08-17 13:12:46.503: E/Database(13328): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
08-17 13:12:46.503: E/Database(13328): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
08-17 13:12:46.503: E/Database(13328): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1231)
08-17 13:12:46.503: E/Database(13328): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1658)
08-17 13:12:46.503: E/Database(13328): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1515)
08-17 13:12:46.503: E/Database(13328): at library.DatabaseHandler.addUser(DatabaseHandler.java:69)
08-17 13:12:46.503: E/Database(13328): at com.thryfting.www.RegisterActivity$register.doInBackground(RegisterActivity.java:135)
08-17 13:12:46.503: E/Database(13328): at com.thryfting.www.RegisterActivity$register.doInBackground(RegisterActivity.java:1)
08-17 13:12:46.503: E/Database(13328): at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-17 13:12:46.503: E/Database(13328): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
08-17 13:12:46.503: E/Database(13328): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-17 13:12:46.503: E/Database(13328): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-17 13:12:46.503: E/Database(13328): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-17 13:12:46.503: E/Database(13328): at java.lang.Thread.run(Thread.java:1027)
Below is my database code:
package library;
import java.util.HashMap;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHandler extends SQLiteOpenHelper {
// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "thryfting_api";
// Login table name
private static final String TABLE_LOGIN = "login";
// Login Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_EMAIL = "email";
private static final String KEY_UID = "uid";
private static final String KEY_CREATED_AT = "created_at";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "("
+ KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_NAME + " TEXT,"
+ KEY_EMAIL + " TEXT UNIQUE,"
+ KEY_UID + " INTEGER,"
+ KEY_CREATED_AT + " TEXT" + ")";
db.execSQL(CREATE_LOGIN_TABLE);
}
// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN);
// Create tables again
onCreate(db);
}
/**
* Storing user details in database
* */
public void addUser(String name, String email, String uid, String created_at) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, name); // Name
values.put(KEY_EMAIL, email); // Email
values.put(KEY_UID, uid); // Email
values.put(KEY_CREATED_AT, created_at); // Created At
// Inserting Row
db.insert(TABLE_LOGIN, null, values);
db.close(); // Closing database connection
}
/**
* Getting user data from database
* */
public HashMap<String, String> getUserDetails(){
HashMap<String,String> user = new HashMap<String,String>();
String selectQuery = "SELECT * FROM " + TABLE_LOGIN;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// Move to first row
cursor.moveToFirst();
if(cursor.getCount() > 0){
user.put("name", cursor.getString(1));
user.put("email", cursor.getString(2));
user.put("uid", cursor.getString(3));
user.put("created_at", cursor.getString(4));
}
cursor.close();
db.close();
// return user
return user;
}
/**
* Getting user login status
* return true if rows are there in table
* */
public int getRowCount() {
String countQuery = "SELECT * FROM " + TABLE_LOGIN;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
int rowCount = cursor.getCount();
db.close();
cursor.close();
// return row count
return rowCount;
}
/**
* Re crate database
* Delete all tables and create them again
* */
public void resetTables(){
SQLiteDatabase db = this.getWritableDatabase();
// Delete All Rows
db.delete(TABLE_LOGIN, null, null);
db.close();
}
}
the error message
indicates that your database is not in the state you expect it. You do create that table with a column named
uid(KEY_UID) but you have most likely added that column after the database was already created on your device. Once it is created it will persist until you explicitly delete that file or uninstall your app. AndonCreatewill not be executed again until the database file is missing.What you need to do is to upgrade the database version each time you change the table definitions. That will trigger the
onUpgradecode which will then recreate your table the way you defined it.Your fix is most likely just