my friends help me do this android app, but i dont really know what is the actual problems here. Can you guys help me? I try to run the code in the android, but when i try to login in my app login menu, it crashes
Here is my Database Helper
package com.example.ikramhs.shoerack;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "login";
private static final int DB_VERSION = 1;
private static final String DB_TABLE = "create table user (id integer primary key autoincrement, " + "username text not null,password text not null;";
public DatabaseHelper(Context context){
super(context, DB_NAME, null,DB_VERSION) ;
}
#Override
public void onCreate(SQLiteDatabase db) {
}
#Override
public void onUpgrade (SQLiteDatabase database, int oldVersion, int newVersion ){
Log.w(DatabaseHelper.class.getName(),
"Upgrading database from version" + oldVersion + "to " + newVersion + ", which will destroy all old data");
database.execSQL("DROP TABLE IF EXISTS user");
onCreate(database);
}
}
and here is my Database Adapter file
package com.example.ikramhs.shoerack;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class DatabaseAdapter {
private static final String LOGIN_TABLE = "user";
public static final String COL_ID = "id";
public static final String COL_USERNAME = "username";
public static final String COL_PASSWORD = "password";
private Context context;
private SQLiteDatabase database;
private DatabaseHelper dbHelper;
public DatabaseAdapter(Context context) {
this.context = context;
}
public DatabaseAdapter open() {
dbHelper = new DatabaseHelper(context) ;
database = dbHelper.getWritableDatabase();
return this;
}
public void close() {
dbHelper.close();
}
public long createUser (String username, String password)
{
ContentValues initialValues = createUserTableContentValues ( username,password );
return database.insert(LOGIN_TABLE,null,initialValues);
}
public Cursor fetchUser(String username, String password)
{
Cursor myCursor = database.query(LOGIN_TABLE, new String[] {COL_ID, COL_USERNAME, COL_PASSWORD},
COL_USERNAME + "=" + username + "'AND" + COL_PASSWORD + "='" + password + "'", null,null,null,null);
if (myCursor != null) {
myCursor.moveToFirst();
}
return myCursor;
}
private ContentValues createUserTableContentValues(String username, String password) {
ContentValues values = new ContentValues();
values.put(COL_USERNAME, username);
values.put(COL_PASSWORD, password);
return values;
}
}
Here's the logcat in Android Monitor
02-02 01:55:48.439 2659-2659/com.example.ikramhs.shoerack I/art: Not late-enabling -Xcheck:jni (already on)
02-02 01:55:48.585 2659-2659/com.example.ikramhs.shoerack W/System: ClassLoader referenced unknown path: /data/app/com.example.ikramhs.shoerack-2/lib/x86
02-02 01:55:48.639 2659-2672/com.example.ikramhs.shoerack D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
02-02 01:55:48.725 2659-2672/com.example.ikramhs.shoerack I/OpenGLRenderer: Initialized EGL, version 1.4
02-02 01:55:48.770 2659-2672/com.example.ikramhs.shoerack W/EGL_emulation: eglSurfaceAttrib not implemented
02-02 01:55:48.770 2659-2672/com.example.ikramhs.shoerack W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad920680, error=EGL_SUCCESS
02-02 01:55:49.803 2659-2665/com.example.ikramhs.shoerack W/art: Suspending all threads took: 23.765ms
02-02 01:55:53.288 2659-2672/com.example.ikramhs.shoerack E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab9c45a0
02-02 01:55:54.230 2659-2665/com.example.ikramhs.shoerack W/art: Suspending all threads took: 8.143ms
02-02 01:55:54.294 2659-2672/com.example.ikramhs.shoerack W/EGL_emulation: eglSurfaceAttrib not implemented
02-02 01:55:54.294 2659-2672/com.example.ikramhs.shoerack W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad926e60, error=EGL_SUCCESS
02-02 01:56:08.158 2659-2659/com.example.ikramhs.shoerack E/SQLiteLog: (1) near "'ANDpassword='": syntax error
02-02 01:56:08.159 2659-2659/com.example.ikramhs.shoerack D/AndroidRuntime: Shutting down VM
02-02 01:56:08.159 2659-2659/com.example.ikramhs.shoerack E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ikramhs.shoerack, PID: 2659
android.database.sqlite.SQLiteException: near "'ANDpassword='": syntax error (code 1): , while compiling: SELECT id, username, password FROM user WHERE username=therhaman'ANDpassword='091192'
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
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:1316)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202)
at com.example.ikramhs.shoerack.DatabaseAdapter.fetchUser(DatabaseAdapter.java:42)
at com.example.ikramhs.shoerack.welcome.LogMeIn(welcome.java:68)
at com.example.ikramhs.shoerack.welcome.access$000(welcome.java:17)
at com.example.ikramhs.shoerack.welcome$1.onClick(welcome.java:46)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-02 01:56:09.955 2659-2659/? I/Process: Sending signal. PID: 2659 SIG: 9
android.database.sqlite.SQLiteException: near "'ANDpassword='": syntax error (code 1): , while compiling: SELECT id, username, password FROM user WHERE username=therhaman'ANDpassword='091192'
You need a space between AND and password.
Your Logcat is clearly said it "near "'ANDpassword='": syntax error (code 1)".
You have SQL syntax error and I believe it should be "AND password=". Change below line such that it becomes (space after COL_PASSWORD):
COL_USERNAME + "=" + username + "' AND " + COL_PASSWORD + "='" + password + "
Related
This question already has answers here:
When does SQLiteOpenHelper onCreate() / onUpgrade() run?
(15 answers)
Closed 5 years ago.
I have a Table named as notes and a method called getlist() which retrieve data from the database. Now the problem is when getlist() method is executed the application crashes and it says that no such column DeletedNotes even tho it is specified in create table statement.
Here is my code:
public class DBOpenHelper extends SQLiteOpenHelper {
public static final String DB_Name="Notes.db";
public static final int DB_Version=1;
public static final String Table_Name="NoteData";
public static final String id="_id";
public static final String Note_Title="noteTitle";
public static final String Note_Text="NoteText";
public static final String Note_Created="NoteCreated";
public static final String DELETED_NOtes="DeletedNotes";
public static final String Archived_Notes="ArchiveNotes";
public static final int True=1;
public static final int False=0;
//SQLite Query
public static final String Table_Create=
"CREATE TABLE "+Table_Name+"("
+id+" INTEGER PRIMARY KEY, "
+Note_Title+" TEXT, "
+Note_Text+" TEXT, "
+Note_Created+" TEXT default CURRENT_TIMESTAMP, "
+DELETED_NOtes+"INTEGER DEFAULT "+False+", "
+Archived_Notes+"INTEGER DEFAULT "+False+" "
+");";
public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DB_Name, null, DB_Version);
}
#Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(Table_Create);
}
#Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS "+Table_Name);
onCreate(sqLiteDatabase);
}
public Cursor getList(){
SQLiteDatabase sqLiteDatabase=this.getWritableDatabase();
Cursor data=sqLiteDatabase.rawQuery("Select * from "+Table_Name+" WHERE "+DELETED_NOtes+" = "+False+" AND "+Archived_Notes+" = "+False+"; ",null);
return data;
}
and here is my logcat:
08-26 18:52:14.812 8731-8731/com.example.chirag.stickynotes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.chirag.stickynotes, PID: 8731
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.chirag.stickynotes/com.example.chirag.stickynotes.MainActivity}: android.database.sqlite.SQLiteException: no such column: DeletedNotes (code 1): , while compiling: Select * from NoteData WHERE DeletedNotes = 0 AND ArchiveNotes = 0;
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: android.database.sqlite.SQLiteException: no such column: DeletedNotes (code 1): , while compiling: Select * from NoteData WHERE DeletedNotes = 0 AND ArchiveNotes = 0;
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:1318)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1257)
at com.example.chirag.stickynotes.DBOpenHelper.getList(DBOpenHelper.java:85)
at com.example.chirag.stickynotes.TextFragment.onCreateView(TextFragment.java:64)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2239)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1332)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1574)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1641)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:794)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2415)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2200)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2153)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2063)
at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:554)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)
at android.app.Activity.performStart(Activity.java:6696)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2628)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
08-26 18:52:14.893 1585-1662/system_process W/ActivityManager: Force finishing activity com.example.chirag.stickynotes/.MainActivity
08-26 18:52:15.121 1585-3167/system_process I/OpenGLRenderer: Initialized EGL, version 1.4
08-26 18:52:15.121 1585-3167/system_process D/OpenGLRenderer: Swap behavior 1
You should leave space beside the column name, DELETED_NOtes and Archived_Notes. In your code, since you don't have space between the column name and the type INTEGER, the table would have got created with a column name like this: DeletedNotesINTEGER
public static final String Table_Create =
"CREATE TABLE "+Table_Name +"("
+id+" INTEGER PRIMARY KEY, "
+Note_Title+" TEXT, "
+Note_Text+" TEXT, "
+Note_Created+" TEXT default CURRENT_TIMESTAMP, "
+DELETED_NOtes+" INTEGER DEFAULT "+False+", "
+Archived_Notes+" INTEGER DEFAULT "+False+" "
+");";
I'm trying to create database using this tutorial. I'm still new in android developing, so probably this is something very easy, but still learning. This is the error i'm getting:
07-19 14:37:18.235: E/SQLiteLog(9089): (1) no such table: grocery
07-19 14:37:18.245: E/AndroidRuntime(9089): FATAL EXCEPTION: main
07-19 14:37:18.245: E/AndroidRuntime(9089): Process: com.dusandimitrijevic.grocerylist, PID: 9089
07-19 14:37:18.245: E/AndroidRuntime(9089): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dusandimitrijevic.grocerylist/com.dusandimitrijevic.grocerylist.MainActivity}: android.database.sqlite.SQLiteException: no such table: grocery (code 1): , while compiling: SELECT _id, title, price FROM grocery
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.app.ActivityThread.access$900(ActivityThread.java:177)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.os.Handler.dispatchMessage(Handler.java:102)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.os.Looper.loop(Looper.java:145)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.app.ActivityThread.main(ActivityThread.java:5942)
07-19 14:37:18.245: E/AndroidRuntime(9089): at java.lang.reflect.Method.invoke(Native Method)
07-19 14:37:18.245: E/AndroidRuntime(9089): at java.lang.reflect.Method.invoke(Method.java:372)
07-19 14:37:18.245: E/AndroidRuntime(9089): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
07-19 14:37:18.245: E/AndroidRuntime(9089): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
07-19 14:37:18.245: E/AndroidRuntime(9089): Caused by: android.database.sqlite.SQLiteException: no such table: grocery (code 1): , while compiling: SELECT _id, title, price FROM grocery
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1093)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:670)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1440)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1287)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1158)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1326)
07-19 14:37:18.245: E/AndroidRuntime(9089): at com.dusandimitrijevic.data.GroceryDbAdapter.fetchAllItems(GroceryDbAdapter.java:145)
07-19 14:37:18.245: E/AndroidRuntime(9089): at com.dusandimitrijevic.grocerylist.MainActivity.fillData(MainActivity.java:79)
07-19 14:37:18.245: E/AndroidRuntime(9089): at com.dusandimitrijevic.grocerylist.MainActivity.onCreate(MainActivity.java:59)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.app.Activity.performCreate(Activity.java:6289)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
07-19 14:37:18.245: E/AndroidRuntime(9089): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
07-19 14:37:18.245: E/AndroidRuntime(9089): ... 10 more
Here is the code of my Database:
package com.dusandimitrijevic.data;
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;
/**
* Simple notes database access helper class. Defines the basic CRUD operations
* for the notepad example, and gives the ability to list all notes as well as
* retrieve or modify a specific note.
*
* This has been improved from the first version of this tutorial through the
* addition of better error handling and also using returning a Cursor instead
* of using a collection of inner classes (which is less scalable and not
* recommended).
*/
public class GroceryDbAdapter {
public static final String KEY_TITLE = "title";
public static final String KEY_PRICE = "price";
public static final String KEY_ROWID = "_id";
private static final String TAG = "GroceryDbAdapter";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private Context mCtx;
/**
* Database creation sql statement
*/
private static final String DATABASE_CREATE =
"create table grocery (_id integer primary key autoincrement, "
+ "title text not null, price text not null);";
private static final String DATABASE_NAME = "data";
private static final String DATABASE_TABLE = "grocery";
private static final int DATABASE_VERSION = 2;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
#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 notes");
onCreate(db);
}
}
/**
* Constructor - takes the context to allow the database to be
* opened/created
*
* #param ctx the Context within which to work
*/
public GroceryDbAdapter(Context ctx) {
this.mCtx = ctx;
}
/**
* Open the notes database. If it cannot be opened, try to create a new
* instance of the database. If it cannot be created, throw an exception to
* signal the failure
*
* #return this (self reference, allowing this to be chained in an
* initialization call)
* #throws SQLException if the database could be neither opened or created
*/
public GroceryDbAdapter open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
mDbHelper.close();
}
/**
* Create a new note using the title and body provided. If the note is
* successfully created return the new rowId for that note, otherwise return
* a -1 to indicate failure.
*
* #param title the title of the note
* #param body the body of the note
* #return rowId or -1 if failed
*/
public long createItem(String title, String price) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_PRICE, price);
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
/**
* Delete the note with the given rowId
*
* #param rowId id of note to delete
* #return true if deleted, false otherwise
*/
public boolean deleteItem(long rowId) {
return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}
/**
* Return a Cursor over the list of all notes in the database
*
* #return Cursor over all notes
*/
public Cursor fetchAllItems() {
return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,
KEY_PRICE}, null, null, null, null, null);
}
/**
* Return a Cursor positioned at the note that matches the given rowId
*
* #param rowId id of note to retrieve
* #return Cursor positioned to matching note, if found
* #throws SQLException if note could not be found/retrieved
*/
public Cursor fetchItem(long rowId) throws SQLException {
Cursor mCursor =
mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_TITLE, KEY_PRICE}, KEY_ROWID + "=" + rowId, null,
null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
/**
* Update the note using the details provided. The note to be updated is
* specified using the rowId, and it is altered to use the title and body
* values passed in
*
* #param rowId id of note to update
* #param title value to set note title to
* #param body value to set note body to
* #return true if the note was successfully updated, false otherwise
*/
public boolean updateItem(long rowId, String title, String price) {
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
args.put(KEY_PRICE, price);
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}
}
I'm still learning, so any help or advice would be appricieated.
Most probably, you change the SQL statement defined in your DATABASE_CREATE String and than you change your database version.
Changing the database version, onUpgrade() is called and the SQL statement inside it is called:
db.execSQL("DROP TABLE IF EXISTS notes");
This try to remove a table the probably does not exists.
Then the onCreate() is called and you try to create a table, but since it probably already exsists, nothing happen, but your table remains the one you created in the version 1.
So, the solutions can either be:
Unistall the app from your device and reinstall it (the previous version of the database will be deleted)
Remove the instruction:
db.execSQL("DROP TABLE IF EXISTS notes");
and use:
db.execSQL("DROP TABLE IF EXISTS grocery");
In your DATABASE_CREATE query remove semicolon that is inside the string It is causing error
private static final String DATABASE_CREATE =
"create table grocery (_id integer primary key autoincrement, "
+ "title text not null, price text not null)";//removed which was semicolon inside it
I know that there are a lot of topics on this error but I tried a lot of solutions and still I am stuck whit this error.
It´s my first time playing around with SQLite, and I don´t understand what is happening wrong there.
05-26 08:34:20.369 23124-23124/com.danynuria.fmp D/ODOperations﹕ Overall Table Created
05-26 08:34:20.373 23124-23124/com.danynuria.fmp E/SQLiteLog﹕ (1) no such table: database_info
05-26 08:34:20.374 23124-23124/com.danynuria.fmp E/SQLiteDatabase﹕ Error inserting date=26 / 4 / 2015 county=Bedfordshire co2_saved=149 distance=1245 distance_type=run user_id=1
android.database.sqlite.SQLiteException: no such table: database_info (code 1): , while compiling: INSERT INTO database_info(date,county,co2_saved,distance,distance_type,user_id) VALUES (?,?,?,?,?,?)
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.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
at com.danynuria.fmp.OverallDatabaseOperations.putInformation(OverallDatabaseOperations.java:73)
at com.danynuria.fmp.MainActivity$1.onClick(MainActivity.java:121)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
05-26 08:34:20.374 23124-23124/com.danynuria.fmp D/ODOperations﹕ One row inserted
And my code:
package com.danynuria.fmp;
import android.app.DownloadManager;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import com.danynuria.fmp.OverallTableData.OverallTableinfo;
import java.sql.SQLException;
public class OverallDatabaseOperations extends SQLiteOpenHelper {
// Create integer that register version of database
private static final int overallDatabase_version = 1;
// Create query
public String CREATE_QUERY = "CREATE TABLE "+OverallTableinfo.OVERALL_TABLE_NAME+"( "+OverallTableinfo.USER_ID+" INTEGER, "+OverallTableinfo.DISTANCE+
" INTEGER, "+OverallTableinfo.DISTANCE_TYPE+" TEXT, "+OverallTableinfo.COUNTY+" TEXT, "+OverallTableinfo.CO2_SAVED+
" INTEGER, "+OverallTableinfo.DATE+" TEXT);";
// Creating the database using SQLiteOpenHelper constructor
public OverallDatabaseOperations(Context context) {
super(context, OverallTableinfo.OVERALL_DATABASE_NAME, null, overallDatabase_version);
}
public void onCreate(SQLiteDatabase odb ){
odb.execSQL(CREATE_QUERY);
Log.d("ODOperations", "Overall Table Created");
}
public void onUpgrade(SQLiteDatabase arg0,int arg1, int arg2){
}
// Create a method to insert data into database
public void putInformation(OverallDatabaseOperations dop, Integer id, Integer distance, String type, String county, Integer co2saved, String date) {
// Create a SQLite database object
SQLiteDatabase OSQ = dop.getWritableDatabase();
// Create an object for content values
ContentValues ncv = new ContentValues();
// Passing the first column value
ncv.put(OverallTableinfo.USER_ID, id);
ncv.put(OverallTableinfo.DISTANCE, distance);
ncv.put(OverallTableinfo.DISTANCE_TYPE, type);
ncv.put(OverallTableinfo.COUNTY, county);
ncv.put(OverallTableinfo.CO2_SAVED, co2saved);
ncv.put(OverallTableinfo.DATE, date);
// Inserting data into table
OSQ.insert(OverallTableinfo.OVERALL_DATABASE_NAME, null, ncv);
Log.d("ODOperations", "One row inserted");
}
}
And the other class:
package com.danynuria.fmp;
import android.provider.BaseColumns;
public class OverallTableData {
// Create constructor
public OverallTableData() {
}
// Create abstract class
public static abstract class OverallTableinfo implements BaseColumns {
// Create first column in database
public static final String USER_ID = "user_id";
// Create second column in database
public static final String DISTANCE = "distance";
// Create third column in database
public static final String DISTANCE_TYPE = "distance_type";
// Create forth column in database
public static final String COUNTY = "county";
// Create fifth column in database
public static final String CO2_SAVED = "co2_saved";
// Create sixth column in database
public static final String DATE = "date";
// Define database name
public static final String OVERALL_DATABASE_NAME = "database_info";
// Define table name
public static final String OVERALL_TABLE_NAME = "overall_info";
}
}
Any suggestions are highly appreciated
you have to use OVERALL_TABLE_NAME instead of OVERALL_DATABASE_NAME in your insert:
OSQ.insert(OverallTableinfo.OVERALL_TABLE_NAME, null, ncv);
I am learning how to create and insert values into SQLite DB. the application has a button and chronometer. clicking the button starts the timer and clicking it again stops it. On stop, the values are to be stored into the DB. I can see from the file explorer in Android Studio that the DB and the table is getting created. There is evidence in the Log to suggest the start and stop time is also getting captured, but the values are not getting inserted into the DB. I am pasting snippet of the code used to create the DB and then to insert the record. I am also pasing snippet of the log where the error is output. Please help.
import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.content.Context; import android.util.Log; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class DBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "Feeds.db";
public static String TIMESTAMP_START;
public static String TIMESTAMP_END;
public static int _ID = 0;
public static final String DATABASE_TABLE = "T_FEEDRECORDS";
private static final String SQL_CREATE_ENTRIES = "CREATE TABLE T_FEEDRECORDS ( _ID INTEGER primary key autoincrement, TIMESTAMP_START TEXT, TIMESTAMP_END TEXT)" ;
public DBHelper(Context context)
{
super(context,DATABASE_NAME, null, DATABASE_VERSION );
}
public void onCreate(SQLiteDatabase db)
{
Log.d("onCreate", "before DB Create");
try {
db.execSQL(SQL_CREATE_ENTRIES);
} catch(SQLException ex){ Log.d("onCreate", "DB creation exception:"+ ex.getMessage()); }
Log.d("onCreate", "after DB Create" + db.toString());
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF IT EXISTS " + DATABASE_TABLE);
Log.d("onUpgrade", "dropping table");
onCreate(db);
}
public void createFeedRecord (FeedRecords feedRecord){
ContentValues feedContent = new ContentValues();
feedContent.put(TIMESTAMP_START, feedRecord.getStartTime());
feedContent.put(TIMESTAMP_END, feedRecord.getEndTime());
try {
SQLiteDatabase db = this.getWritableDatabase();
Log.d("createFeedRecord values before insert", "start time : " + feedRecord.getStartTime() + " Timer end:" + feedRecord.getEndTime());
db.insertOrThrow(DATABASE_TABLE,null, feedContent );
db.close();
} catch(SQLException ex) {Log.d("SQL Exdception in create feed record", "" + ex.getLocalizedMessage());}
Log.d("createFeedRecord", "after content values");
}
}
LOG SNIPPET
02-04 09:57:43.287 2213-2213/? D/onClick......﹕ Timer Start time: 150204_095743
....
02-04 10:01:25.738 2213-2213/? D/onClick......﹕ Timer Stop time: 150204_100125
02-04 10:01:25.738 2213-2213/? D/inster Time Record﹕ after create Feed
02-04 10:01:25.754 1239-1293/? W/AudioTrack﹕ AUDIO_OUTPUT_FLAG_FAST denied by client
02-04 10:01:25.763 2213-2213/? D/createFeedRecord values before insert﹕ start time : 150204_095743 Timer end:150204_100125
02-04 10:01:25.763 2213-2213/? E/SQLiteLog﹕ (1) near "null": syntax error
02-04 10:01:25.763 2213-2213/? D/SQL Exdception in create feed record﹕ near "null": syntax error (code 1): , while compiling: INSERT INTO T_FEEDRECORDS(null) VALUES (?)
02-04 10:01:25.763 2213-2213/? D/createFeedRecord﹕ after content values
You need to assign
public static String TIMESTAMP_START="TIMESTAMP_START";
public static String TIMESTAMP_END="TIMESTAMP_END";
OR
Directly provide column name
ContentValues feedContent = new ContentValues();
feedContent.put("TIMESTAMP_START", feedRecord.getStartTime());
feedContent.put("TIMESTAMP_END", feedRecord.getEndTime());
I am creating a database for my application using a Database helper class, I then try to insert data into it within another class. But I am getting an error.
I am getting the following error in Logcat and dont know how to solve it? :
07-15 16:20:30.348: E/SQLiteDatabase(16270): Error inserting score=0 date=1405437630327 name=ry
07-15 16:20:30.348: E/SQLiteDatabase(16270): android.database.sqlite.SQLiteConstraintException: column name is not unique (code 19)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:976)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1591)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1461)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at com.example.multapply.DatabaseHelper.addScore(DatabaseHelper.java:84)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at com.example.multapply.RandomTest.onClick(RandomTest.java:161)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.view.View.performClick(View.java:4633)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.view.View$PerformClick.run(View.java:19330)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.os.Handler.handleCallback(Handler.java:733)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.os.Handler.dispatchMessage(Handler.java:95)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.os.Looper.loop(Looper.java:157)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.app.ActivityThread.main(ActivityThread.java:5356)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at java.lang.reflect.Method.invokeNative(Native Method)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at java.lang.reflect.Method.invoke(Method.java:515)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at dalvik.system.NativeStart.main(Native Method)
Related Code:
Database helper class:
package com.example.multapply;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 3;
// Database Name
private final static String DATABASE_NAME = "MultapplyDatabase";
// Contacts table name
private static final String TABLE_SCORE = "scores";
// Contacts Table Columns names
private static final String COL_NAME = "name";
private static final String COL_SCORE = "score";
private static final String COL_DATE = "date";
/**
* Constructor
* #param context
*/
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
/**
* Method that creates the database
*/
#Override
public void onCreate(SQLiteDatabase db) {
//NOTE: may need to alter the below to take out everything after INTEGER
String CREATE_TABLE_SCORE = "CREATE TABLE " + TABLE_SCORE + "("
+ COL_NAME + " STRING PRIMARY KEY," + COL_SCORE + " INTEGER," + COL_DATE + " LONG" + ")";
db.execSQL(CREATE_TABLE_SCORE);
}
/**
* Method that upgrades the database
*/
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_SCORE);
// Create tables again
onCreate(db);
}
/**
* All CRUD operations
*/
// Adding new score details (Name, score, date)
void addScore(Score score) {
SQLiteDatabase db = this.getWritableDatabase();
//ContentValues- holds the values.
ContentValues values = new ContentValues();
values.put(COL_NAME, score.getName());
values.put(COL_SCORE, score.getScore());
values.put(COL_DATE, score.getDate());
// Inserting Row (i.e. the values that were entered from above
db.insert(TABLE_SCORE, null, values);
db.close(); // Closing database connection
}
/**
* Method will return a single Name and score
* #param id
* #return
*/
// Getting single contact
Score getScore(String name) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_SCORE, new String[] { COL_NAME,
COL_SCORE, COL_DATE}, COL_NAME + "=?",
new String[] { String.valueOf(name) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Score score = new Score(cursor.getString(0),Integer.parseInt(cursor.getString(1)),cursor.getLong(2));
// return contact
return score;
}
/**
* Method will return a list of all the scores
* #return
*/
// Getting All Contacts
public List<Score> getAllScores() {
List<Score> scoreList = new ArrayList<Score>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_SCORE;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Score score = new Score();
score.setName(cursor.getString(0));
score.setScore(Integer.parseInt(cursor.getString(1)));
score.setDate(cursor.getLong(2));
// Adding contact to list
scoreList.add(score);
} while (cursor.moveToNext());
}
// return contact list
return scoreList;
}
}
Code relating to entering data into the database:
/**
* CRUD Operations
* */
// Inserting Contacts
Log.d("Insert: ", "Inserting ..");
db.addScore(new Score(UserName.getUserName(), score, System
.currentTimeMillis()));
// Reading all contacts
Log.d("Reading: ", "Reading all contacts..");
List<Score> scores = db.getAllScores();
for (Score s : scores) {
String log = "Name: " + s.getName() + " ,Score: "
+ s.getScore() + "Date: " + s.getDate();
// Writing Contacts to log
Log.d("Details: ", log);
}
}
}
This means that you are trying to use a parameter in the "name" column that has already saved or used in your database because "name" is a primary key
You are violating UNIQUE constraint because your column name is primary key. This is reason of SQLiteConstraintException.