RuntimeException, вызванное SQLiteException, синтаксическая ошибка - PullRequest
0 голосов
/ 10 июня 2018

Я новичок в разработке для Android и базах данных SQLite, поэтому, пожалуйста, поддержите меня в этом вопросе (также, мой первый вопрос на этом сайте, надеюсь, что все в порядке).

Итак, моя база данных состоит изтри таблицы:

  1. Таблица records
  2. Таблица locations
  3. Таблица 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 являются общими для всех таблиц.Кто-то хочет взглянуть и помочь мне понять, что я делаю неправильно?

Кроме того, если вы считаете, что с моим вопросом что-то не так, пожалуйста, дайте мне знать, чтобы в будущем те же ошибки не повторялись.

1 Ответ

0 голосов
/ 10 июня 2018
+ DatabaseHelper.TAGS_ID + " "+ LOCATIONS_NAME_WITH_PREFIX + ", " +
                           ^^^

пропущена запятая

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...