Исключение SQLite при попытке создать таблицу в Android

#android #sql #sqlite

#Android #sql #sqlite

Вопрос:

Я следую руководству поhttp://developer.android.com/training/basics/data-storage/databases.html

с незначительными изменениями в соответствии с моими потребностями, но мое приложение выходит из строя, как только оно пытается создать таблицу. Logcat отображает исключение sqlite, синтаксическую ошибку рядом с индексом. Хотя я проверил три раза, и синтаксис выглядит правильно.

Исключение гласит: near "index": syntax error (code 1): , while compiling: CREATE TABLE my_locations ( index INTEGER PRIMARY KEY, loc_name TEXT, loc_id TEXT);

Вот мой код

 private static final String TEXT_TYPE = " TEXT";
    private static final String COMMA_SEP = ", ";
    private static final String SQL_CREATE_ENTRIES =
        "CREATE TABLE "   FeedEntry.TABLE_NAME   " ( "  
        FeedEntry.COLUMN_NAME_INDEX   " INTEGER PRIMARY KEY, "  
        FeedEntry.COLUMN_NAME_LOC_NAME   TEXT_TYPE   COMMA_SEP  
        FeedEntry.COLUMN_NAME_LOC_ID   TEXT_TYPE  
        ");";

    private static final String SQL_DELETE_ENTRIES =
        "DROP TABLE IF EXISTS "   FeedEntry.TABLE_NAME;

    // If you change the database schema, you must increment the database version.
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "PersonalLocations.db";

    public PersonalLocationsDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_ENTRIES);
    }
  

Ответ №1:

INDEX является зарезервированным словом SQLite и не может использоваться в качестве имени.

Ссылка:http://www.sqlite.org/lang_keywords.html

Так что просто переименуйте index в id (по соглашению, это _id ) или что-то, что вам больше нравится.
_id требуется несколькими вспомогательными методами базы данных (но вы можете использовать rowID AS _id трюк).

Вы могли также пропустить явное добавление поля id, поскольку есть скрытое rowId поле, которое можно использовать в качестве замены.

По крайней мере, для небольших структур (1 таблица и несколько полей или тому подобное).

Ответ №2:

Вы не можете использовать зарезервированные слова в имени столбца таблицы sqlite, так как index это зарезервированное слово.