Java SQLiteException引起的RuntimeException,语法错误

Java SQLiteException引起的RuntimeException,语法错误,java,android,sqlite,select,Java,Android,Sqlite,Select,我对Android开发和SQLite数据库还不熟悉,所以请在这一点上耐心听我说(也是我在这个网站上的第一个问题,希望没问题) 因此,我的数据库由三个表组成: 表记录 表位置 表标签 我就是这样创建表的: private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "recordsDatabase"; //Common columns public static final

我对Android开发和SQLite数据库还不熟悉,所以请在这一点上耐心听我说(也是我在这个网站上的第一个问题,希望没问题)

因此,我的数据库由三个表组成:

  • 记录
  • 位置
  • 标签
  • 我就是这样创建表的:

    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];
    
    但是如果我看一下我的语法,我没有发现任何错误。现在我之所以使用带有前缀的
    记录\u ID\u
    带有前缀的记录\u NAME\u
    带有前缀的位置\u NAME\u和带有前缀的
    位置\u NAME\u
    是为了避免混淆,因为
    ID
    NAME
    列在所有表中都很常见。是否有人愿意看一看并帮助我理解我做错了什么

    另外,如果你认为我的问题有问题,请告诉我,这样以后就不会再犯同样的错误了

    + DatabaseHelper.TAGS_ID + " "+ LOCATIONS_NAME_WITH_PREFIX + ", " +
                               ^^^
    

    缺少逗号

    您需要发布崩溃堆栈跟踪。更好的是,先仔细阅读这篇文章,这是一种可怕的疑问!为什么你不能使用标准连接?如果我的问题给你带来不适,我很抱歉,这个应用程序是为了一个学校项目,我们必须遵循一些指导原则。在另一个例子中,我实际上使用的是
    JOIN
    语句!我也同意,
    JOIN
    语句更清晰。哇,这实际上解决了我的问题。。。我的意思是,我已经面临新的问题了,但至少这个问题已经解决了。非常感谢你!