#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
. Он автоматически вставит увеличенное значение для атрибута.