Сбой создания таблицы Android (рядом с «автоинкрементом»: синтаксическая ошибка)?

#android #sqlite

#Android #sqlite

Вопрос:

  public static final String MYDATABASE_NAME = "MY_DATABASE";
 public static final String MYDATABASE_TABLE = "MY_TABLE";
 public static final String MYDATABASE_TABLE2 = "MY_TABLE2";
 public static final int MYDATABASE_VERSION = 1;
 public static final String KEY_ID = "_id";
 public static final String KEY_ID2 = "_id2";
 public static final String KEY_CONTENT1 = "Content1";
 public static final String KEY_CONTENT2 = "Content2";
 public static final String KEY_CONTENT3 = "Content3";

 //create table MY_DATABASE (ID integer primary key, Content text not null);
 private static final String SCRIPT_CREATE_DATABASE = "create table "   MYDATABASE_TABLE   " (" 
                                                         KEY_ID   " integer primary key autoincrement, " 
                                                          KEY_CONTENT1   " text not null);";

 private static final String SCRIPT_CREATE_DATABASE2 = "create table "   MYDATABASE_TABLE2   " (" 
                                                          KEY_ID2   " integer autoincrement, " 
                                                          KEY_CONTENT2   " text not null, " 
                                                          KEY_CONTENT3   " text not null, "
                                                          " FOREIGN KEY (" KEY_ID2 ") REFERENCES " MYDATABASE_TABLE " (" KEY_ID "));";
  

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

09-29 13:41:19.760: ОШИБКА / База данных (334): сбой 1 (рядом с «автоинкрементом»: синтаксическая ошибка) в 0x218df0 при подготовке «создать таблицу MY_TABLE2 (автоинкремент _id2 integer, текст Content2 не равен нулю, текст Content3 не равен нулю, ВНЕШНИЙ КЛЮЧ (_id2) ССЫЛАЕТСЯ НА MY_TABLE (_id));’.

09-29 13:41:19.770: DEBUG / AndroidRuntime(334): завершение работы виртуальной машины

09-29 13:41:19.770: WARN/ dalvikvm(334): threadid = 1: поток завершается с неперехваченным исключением (group = 0x4001d800)

09-29 13:41:19.791: ОШИБКА / AndroidRuntime(334): ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное

09-29 13:41:19.791: ОШИБКА / AndroidRuntime(334): исключение java.lang.RuntimeException: не удается запустить activity ComponentInfo{sep.com/sep.com .SepActivity}: android.database.sqlite.Исключение SQLiteException: рядом с «автоинкрементом»: синтаксическая ошибка: создать таблицу MY_TABLE2 (автоинкремент целого числа _id2, текст Content2 не равен нулю, текст Content3 не равен нулю, ВНЕШНИЙ КЛЮЧ (_id2) ССЫЛАЕТСЯ НА MY_TABLE (_id));

Ответ №1:

Короче говоря: In SQLite a column declared INTEGER PRIMARY KEY will autoincrement. В SQLite нет autoincrement ключевого слова, поэтому вы получаете сообщение об ошибке.

Вы можете узнать больше о часто задаваемых вопросах SQLite.

РЕДАКТИРОВАТЬ: достаточно просто написать integer primary key это. SQLite автоматически увеличит ваш ids .

EDIT2: ваш onUpgrade() метод должен выглядеть следующим образом :

   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            Log.w("MyAppTag","Updating database from version "   oldVersion   " to "
                      newVersion   " .Existing data will be lost.");
            db.execSQL("DROP TABLE IF EXISTS "   MY_TABLE);
            db.execSQL("DROP TABLE IF EXISTS "   MY_TABLE2);
            onCreate(db);
        }
  

Комментарии:

1. спасибо, но как я могу добавить автоинкремент в код. я действительно новичок в программировании на Android, пожалуйста, будьте добры, скажите мне, что я должен сделать с кодом.

2. я сделал то, что вы сказали, а затем я получил следующую ошибку 09-29 14:16:58.580: ОШИБКА / AndroidRuntime(464): java.lang.RuntimeException: не удается запустить activity ComponentInfo{sep.com/sep.com . SepActivity}: android.database.sqlite. Исключение SQLiteException: нет такого столбца: Content2: , при компиляции: ВЫБЕРИТЕ _id, Content1, Content2, Content3 ИЗ MY_TABLE

3. Я думаю, вам нужно обновить свою базу данных. увеличьте версию и убедитесь, что вы правильно внедрили onUpdate()

4. Еще раз привет, ну как это сделать … всегда, когда я делаю изменения, они не обновляются.. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Автоматически сгенерированный заглушка метода TODO } это только в моей функции upgrade().

Ответ №2:

Это:

   KEY_ID2   " integer autoincrement, " 
  

должно быть так:

   KEY_ID2   " integer primary key autoincrement, " 
  

Если вы будете следовать синтаксическим схемам CREATE TABLE , вы увидите, что autoincrement это должно произойти только после primary key .

введите описание изображения здесь
введите описание изображения здесь

Если вы хотите _id2 быть внешним ключом, то вы вообще не хотите, чтобы он автоматически увеличивался.

Комментарии:

1. я сделал то, что вы сказали, а затем получил следующую ошибку 09-29 14:16:58.580: ОШИБКА / AndroidRuntime(464): java.lang.RuntimeException: не удается запустить activity ComponentInfo{sep.com/sep.com . SepActivity}: android.database.sqlite. Исключение SQLiteException: нет такого столбца: Content2: , при компиляции: ВЫБЕРИТЕ _id, Content1, Content2, Content3 ИЗ MY_TABLE

2. @LoshWick: Content2 столбец MY_TABLE2 отсутствует MY_TABLE .

3. частная статическая конечная строка SCRIPT_CREATE_DATABASE = «создать таблицу » MYDATABASE_TABLE » (» KEY_ID » автоинкремент первичного ключа целого числа «, KEY_CONTENT1 » текст не равен нулю);»; частная статическая конечная строка SCRIPT_CREATE_DATABASE2 = «создать таблицу » MYDATABASE_TABLE2 » (» KEY_ID2 » целочисленный первичный ключавтоинкремент, » KEY_CONTENT2 » текст не равен нулю «, KEY_CONTENT3 » текст не равен нулю «, » ВНЕШНИЙ КЛЮЧ (» KEY_ID2 «) ССЫЛАЕТСЯ на » MYDATABASE_TABLE » (» KEY_ID «));»; что я здесь сделал не так?

Ответ №3:

В приведенном выше ответе говорится, что «В SQLite нет ключевого слова autoincrement». Это неверно. Существует ключевое слово с именем «автоинкремент», и я использовал его в первичном ключе.

Например:

    static final String CREATE_LOCATION_TABLE="CREATE TABLE Location" 
            "( LocationID INTEGER PRIMARY KEY AUTOINCREMENT,"  
            " RestuarantID int not null,"  
            " Latitude float not null,"  
            " Longitude float not null)";
  

Также убедитесь, что при вводе данных в эту таблицу вместо первичного ключа используется ключевое слово «null».

Вот так:

    static final String INSERT_LOCATION= "Insert into Location values"  
            "(null,1002,6.905369,79.851514)";
  

Ответ №4:

Три вещи:

  • Удалите завершающий символ; из инструкций.
  • Добавьте ограничение «первичный ключ» в столбец автоинкремента
  • Удалите автоинкремент из столбцов PK — это произойдет автоматически.

Ответ №5:

 sqlite> CREATE TABLE app (a INTEGER PRIMARY KEY NOT NULL, B VARCHAR);
sqlite> insert into app (b) values ('');
sqlite> insert into app (b) values ('a');
sqlite> 
sqlite> insert into app (b) values ('b');
sqlite> insert into app (b) values ('c');
sqlite> insert into app (b) values ('d');
sqlite> select * from app;
1|
2|a
3|b
4|c
5|d
sqlite> exit;
  

ПРИМЕЧАНИЕ: В SQLite нет AUTOINCREMENT ключевого слова. Итак, вам нужно просто использовать INTEGER PRIMARY KEY NOT NULL . Он автоматически вставит увеличенное значение для атрибута.