Sqlite foreign keys cannot resolve error in android studio - sqlite

can anyone work out what is wrong with this code? I'm getting cannot resolve error and both foreign key and references are in red.
private static final String CREATE_TABLE_EXPENSES = "CREATE TABLE " + TABLE_EXPENSES
+ " (" + COL_ID + " INTEGER PRIMARY KEY," + COL_EXPENSES_SOURCE + " TEXT,"
+ COL_EXPENSES_AMOUNT + "NUMERIC," + COL_DATE + "DATE," + COL_DESCRIPTION + "TEXT," +
COL_FOREIGN_KEY_CATEGORY + " INTEGER, "+ FOREIGN_KEY ("+COL_FOREIGN_KEY_CATEGORY+")
REFERENCES "+DatabaseManager.TABLE_CATEGORY+"("+COL_ID+"));";

The answer was purely about adding spaces between some of the + and attributes.

Related

android.database.sqlite.SQLiteException: no such column error even if column exists

I know this question has been asked multiple times, but there is something wrong in my syntax and I can't figure out what. This is the method that adds my column:
Property declaration:
public static final String COLUMN_TS_MILIS = "ts_milis";
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_PRODUCT + " TEXT, " +
COLUMN_PRICE + " TEXT, " +
COLUMN_TS + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP," +
COLUMN_TS_MILIS + "timestamp integer default (cast(strftime('%s', 'now') as int))" +
");";
db.execSQL(query);
and this is the query that triggers the error:
Cursor totalCof = db.rawQuery("SELECT sum(" + COLUMN_PRICE + ")" + " FROM " + TABLE_NAME
+ " WHERE " + COLUMN_TS_MILIS + "= date('now')", null);
What is wrong in my syntax? Many thanks for help!
For the column that is meant to be named as per COLUMN_TS_MILIS, have omitted a space between the column name and the column type and hence the column name is a concatenation of the column name and column type. So assuming COLUMN_TS_MILIS resolves to millis then the QL will be :-
`CREATE TABLE ......,millistimestamp integer default (cast(strftime('%s', 'now') as int))`
instead of
`CREATE TABLE ......,millis timestamp integer default (cast(strftime('%s', 'now') as int))`
Additionally you have specified two types, timestamp and also integer, this won't be an issue SQLIite wise but may lead to confusion.
As such you probably just want
`CREATE TABLE ......,millis integer default (cast(strftime('%s', 'now') as int))`
As such you probably want to use :-
String query = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY, " +
COLUMN_PRODUCT + " TEXT, " +
COLUMN_PRICE + " TEXT, " +
COLUMN_TS + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP," +
COLUMN_TS_MILIS + " INTEGER DEFAULT (cast(strftime('%s', 'now') as int))" +
");";
Note AUTOINCREMENT has been removed as you almost certainly don't need it as it has overheads.
To implement the change, you would have to drop the table, as it exists. The easiest way to do this is to either :-
delete the App's data or
uninstall the App
and then rerun the App (assuming that existing, if any, data can be lost).

Android Sqlite Create syntax error

I can't seem to find out what exactly I did wrong here. Seem to be getting a syntax error in my create command inside the createNewTable method.
Android SQLite Insert Error (Syntax error code 1)
I've added my database code:
private static final String KEY_DATE = "date";
private static final String KEY_TIME_IN = "timeCheckIn";
private static final String KEY_TIME_OUT = "timeCheckOut";
private static final String KEY_LATITUDE_IN = "latCheckIn";
private static final String KEY_LONGITUDE_IN = "longCheckIn";
private static final String KEY_LATITUDE_OUT = "latCheckOut";
private static final String KEY_LONGITUDE_OUT = "longCheckOut";
public void createNewTable(){
SQLiteDatabase db = this.getWritableDatabase(int _id);
Log.v("Database", "Adding Check in table: " + _id);
String CREATE_TABLE = " CREATE TABLE " + Integer.toString(_id) + "("
+ KEY_DATE + " TEXT," + KEY_TIME_IN + " TEXT," + KEY_TIME_OUT + " TEXT,"
+ KEY_LATITUDE_IN + " REAL," + KEY_LONGITUDE_IN + " REAL," + KEY_LATITUDE_OUT + " REAL,"
+ KEY_LONGITUDE_OUT + " REAL" + ")";
db.execSQL(CREATE_TABLE);}
My logcat error is as follows:
Caused by: android.database.sqlite.SQLiteException: near "1": syntax error (code 1): , while compiling: CREATE TABLE 1(date TEXT,timeCheckIn TEXT,timeCheckOut TEXT,latCheckIn REAL,longCheckIn REAL,latCheckOut REAL,longCheckOut REAL)
You have a table name that starts with a number. Not sure if SQLite allows it, but in MySQL, if your table name is a number, then for every query, you need to specify the table number with double quotes. Try giving the table name a prefix
SQLite is telling you unescaped table names are not allowed to start with a number, in this case the number 1. If you want to use numbers you must escape the table name with brackets, like so
String CREATE_TABLE = " CREATE TABLE [" + Integer.toString(_id) + "] ("
+ KEY_DATE + " TEXT," + KEY_TIME_IN + " TEXT," + KEY_TIME_OUT + " TEXT,"
+ KEY_LATITUDE_IN + " REAL," + KEY_LONGITUDE_IN + " REAL," + KEY_LATITUDE_OUT + " REAL,"
+ KEY_LONGITUDE_OUT + " REAL" + ")";

SQlite create table error on Android

//Table names
public static final String TABLE_SUBJECTS = "SUBJECTS";
public static final String TABLE_TIMETABLE = "TIMETABLE";
public static final String TABLE_ATTENDANCE = "ATTENDANCE";
//Column names
public static final String COLUMN_SUBJECTS_SUBJECT = "SUBJECT"; //Subjects
public static final String COLUMN_TIMETABLE_SUBJECT = "SUBJECT"; //Timetable
public static final String COLUMN_TIMETABLE_PERIOD = "PERIOD";
public static final String COLUMN_TIMETABLE_DAY = "DAY";
public static final String COLUMN_ATTENDANCE_SUBJECT = "SUBJECT";
//Attendance
public static final String COLUMN_ATTENDANCE_ATTENDED = "ATTENDED";
public static final String COLUMN_ATTENDANCE_TOTAL = "TOTAL";
public static final String COLUMN_ATTENDANCE_PERCENTAGE = "PERCENTAGE";
//Queries
private static final String SQL_CREATE_TABLE_TIMETABLE = "create table " + TABLE_TIMETABLE + "(" +
COLUMN_TIMETABLE_SUBJECT + " text, " +
COLUMN_TIMETABLE_PERIOD + " integer, " +
COLUMN_TIMETABLE_DAY + " text, " +
"PRIMARY KEY " + "(" +
COLUMN_TIMETABLE_PERIOD + "," +
COLUMN_TIMETABLE_DAY + "), " +
"FOREIGN KEY " + "(" + COLUMN_TIMETABLE_SUBJECT + ") " +
"REFERENCES " + TABLE_SUBJECTS + " (" + COLUMN_SUBJECTS_SUBJECT +
")" + ");";
private static final String SQL_CREATE_TABLE_ATTENDANCE = "create table " + TABLE_ATTENDANCE + "(" +
COLUMN_ATTENDANCE_SUBJECT + " text, " +
COLUMN_ATTENDANCE_ATTENDED + " integer, " +
COLUMN_ATTENDANCE_TOTAL + " integer, " +
COLUMN_ATTENDANCE_PERCENTAGE + " integer, " +
"PRIMARY KEY " + "(" + COLUMN_ATTENDANCE_SUBJECT + "), " +
"FORIEGN KEY " + "(" + COLUMN_ATTENDANCE_SUBJECT + ") " +
"REFERENCES " + TABLE_SUBJECTS + " (" + COLUMN_SUBJECTS_SUBJECT + ")" +
");";
So, I'm trying to program an android app using SQLite of course. I'm running into a problem trying to create the "ATTENDANCE" table.
It says "syntax error near "FOREIGN" ". Now, I don't get this because, as you can see I have created the "TIMETABLE" table successfully and in the "ATTENDANCE" table too followed more or less the same syntax.
I've even tried commenting out the Foreign key. It works fine with just the primary key constraint, but when I couple it with the foreign key constraint the error shows up again. If I comment out the primary key part, with only the foreign key constraint, then it says "syntax error near "SUBJECT" ". So, please help.
You have a typo in your SQL_CREATE_TABLE_ATTENDANCE String. FOREIGN KEY is incorrectly written FORIEGN KEY

SQLITE firing query to search with a non primary key value

db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID + " INTEGER PRIMARY KEY
AUTOINCREMENT, KEY_PNAME + " TEXT NOT NULL, " + KEY_LOC + " TEXT NOT NULL, "
+ KEY_TH + " TEXT NOT NULL);"
Now suppose I have to extract the value of KEY_ROWID of a particular value of KEY_LOC.then what query should I fire on database because in my app if I have a location's latitude longtitude(KEY_LOC). I should be able to show rest of the data associated with that location.

Updating foreign key field in SQLite using ContentValues and update()

I am having trouble getting a foreign key to update in a SQLite table that's running in my Android app.
I have two tables, CASHFLOW_TABLE and ACCOUNT_TABLE. CASHFLOW_TABLE has a foreign key column that references the _id column of ACCOUNT_TABLE. I want to update values in one line of CASHFLOW_TABLE, but when I run this code
String where = "_id=?";
String[] whereArgs = {"7"};
ContentValues cv = new ContentValues();
cv.put(CF_COL_PURPOSE, "Coffee");
cv.put(CF_COL_VALUE, 2.5);
cv.put(CF_COL_ACCOUNT_ID, 4);
myDatabase.update(CF_TABLE_NAME, cv, where, whereArgs);
I receive the error message:
E/Database(22962): Error updating ACCOUNT_ID=4 VALUE=2.5 PURPOSE=Coffee using UPDATE CASHFLOW_TABLE SET ACCOUNT_ID=?, VALUE=?, PURPOSE=? WHERE _id=?
The reason I think this has something to do with the fact that CF_COL_ACCOUNT_ID is a foreign key is that when I remove
cv.put(CF_COL_ACCOUNT_ID, 4);
and run the code just to update just the other values, it works fine. Any ideas what I am doing wrong?
Update: when I try to run the update as an SQL statement, I get the following error, which does seem to suggest that the problem is with the foreign key constraint:
E/Database(24650): Failure 19 (foreign key constraint failed) on 0x314530 when executing 'update CASHFLOW_TABLE set VALUE= 2.5, PURPOSE='coffee', ACCOUNT_ID=4 where _id = 7'
Below is the code in onCreate() that sets up the tables and foreign key constraint. I have simplified it a bit here--there are other columns and one other foreign key (for a third table not shown here).
db.execSQL("Create table " + A_TABLE_NAME + " (" + A_COL_ID + " integer primary key autoincrement, " + A_COL_NAME
+ " text default ('" + A_DEFAULT_ACCOUNT + "'));");
db.execSQL("Create table " + CF_TABLE_NAME + " (" + CF_COL_ID
+ " integer primary key autoincrement, " + CF_COL_VALUE
+ " real not null, "
+ CF_COL_PURPOSE + " text not null, " + CF_COL_TIMESTAMP
+ " text not null default (strftime('%s','now')), "
+ CF_COL_ACCOUNT_ID
+ " integer not null default 1, foreign key ("
+ CF_COL_ACCOUNT_ID + ") references " + A_TABLE_NAME + " ("
+ A_COL_ID + ") on delete set default);");

Resources