Я новичок в разработке для Android и базах данных SQLite, поэтому, пожалуйста, поддержите меня в этом вопросе (также, мой первый вопрос на этом сайте, надеюсь, что все в порядке).
Итак, моя база данных состоит изтри таблицы:
- Таблица
records
- Таблица
locations
- Таблица
tags
Вот как ямы создали таблицы:
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "recordsDatabase";
//Common columns
public static final String ID = "id";
public static final String NAME_COLUMN = "name";
//Tables
public static final String TABLE_RECORDS = "records";
public static final String TABLE_LOCATIONS = "locations";
public static final String TABLE_TAGS = "tags";
//Records table
public static final String KEY_CREATED_AT = "date";
public static final String STARTINGHOUR = "startingHour";
public static final String FINISHINGHOUR = "finishingHour";
public static final String COMMENTS = "comments";
public static final String LOCATIONS_ID = "locationsID";
public static final String TAGS_ID = "tagsID";
//Create table statements
public static final String CREATE_TABLE_RECORDS = "CREATE TABLE "
+ TABLE_RECORDS + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ NAME_COLUMN + " TEXT,"
+ KEY_CREATED_AT + " DATETIME,"
+ STARTINGHOUR + " TEXT,"
+ FINISHINGHOUR + " TEXT,"
+ COMMENTS + " TEXT,"
+ LOCATIONS_ID + " INTEGER, "
+ TAGS_ID + " INTEGER, "
+ "FOREIGN KEY(" + LOCATIONS_ID + ") REFERENCES " + TABLE_LOCATIONS + "(id),"
+ "FOREIGN KEY(" + TAGS_ID + ") REFERENCES " + TABLE_TAGS + "(id))";
public static final String CREATE_TABLE_LOCATIONS = "CREATE TABLE "
+ TABLE_LOCATIONS + "(" + ID + " INTEGER PRIMARY KEY,"
+ NAME_COLUMN + ")";
public static final String CREATE_TABLE_TAGS = "CREATE TABLE "
+ TABLE_TAGS + "(" + ID + " INTEGER PRIMARY KEY,"
+ NAME_COLUMN + ")";
Чуть позже в методе onOpen
я создал следующий оператор PRAGMA:
if(!db.isReadOnly()) db.execSQL("PRAGMA foreign_keys=ON;");
Как вы можете видеть, я 'используя внешние ключи, чтобы установить связь между этими таблицами.Как я уже упоминал, я совершенно новичок в базах данных SQLite, поэтому здесь также может быть проблема, но я не получаю никаких сбоев в этой части.
Однако мне сообщилио следующей ошибке:
AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 ... java.lang.RuntimeException: An error occured while executing doInBackground()
...
Caused by: android.database.sqlite.SQLiteException: near ".": syntax error (code 1): , while compiling: SELECT records.id, records.name ,date, startingHour, finishingHour, comments, locationsID, tagsID locations.name, tags.name FROM records records, locations locations, tags tags WHERE records.locationsID = locations.id AND tagsID = tags.id
, которая указывает на следующие строки кода:
public static final String RECORDS_ID_WITH_PREFIX = "rec.id";
public static final String RECORDS_NAME_WITH_PREFIX = "rec.name";
public static final String LOCATIONS_NAME_WITH_PREFIX = "loc.name";
public static final String TAGS_NAME_WITH_PREFIX = "tg.name";
private static final String WHERE_ID_EQUALS = DatabaseHelper.ID + " =?";
//...some blocks of code in between...\\
String query = "SELECT " + RECORDS_ID_WITH_PREFIX + ", "
+ RECORDS_NAME_WITH_PREFIX + " ,"
+ DatabaseHelper.KEY_CREATED_AT + ", "
+ DatabaseHelper.STARTINGHOUR + ", "
+ DatabaseHelper.FINISHINGHOUR + ", "
+ DatabaseHelper.COMMENTS + ", "
+ DatabaseHelper.LOCATIONS_ID + ", "
+ DatabaseHelper.TAGS_ID + " "+ LOCATIONS_NAME_WITH_PREFIX + ", " + TAGS_NAME_WITH_PREFIX + " FROM "
+ DatabaseHelper.TABLE_RECORDS + " rec, " + DatabaseHelper.TABLE_LOCATIONS + " loc, " + DatabaseHelper.TABLE_TAGS + " tg "
+ " WHERE rec." + DatabaseHelper.LOCATIONS_ID + " = loc." + DatabaseHelper.ID + " AND "
+ DatabaseHelper.TAGS_ID + " = tg." + DatabaseHelper.ID;
Причина, по которой я задаю этот вопрос, заключается в том, что запрос SELECT
должен следоватьэтот синтаксис:
SELECT [columns] FROM [table name] WHERE [conditions];
, но если я посмотрю на свой синтаксис, я не вижу ничего плохого.Теперь причина, по которой я использую RECORDS_ID_WITH_PREFIX
, RECORDS_NAME_WITH_PREFIX
, LOCATIONS_NAME_WITH_PREFIX
и LOCATIONS_NAME_WITH_PREFIX
, состоит в том, чтобы избежать путаницы, поскольку столбцы id
и name
являются общими для всех таблиц.Кто-то хочет взглянуть и помочь мне понять, что я делаю неправильно?
Кроме того, если вы считаете, что с моим вопросом что-то не так, пожалуйста, дайте мне знать, чтобы в будущем те же ошибки не повторялись.