#android-studio #android-sqlite
#java #android-studio #android-sqlite
Вопрос:
Итак, это была ошибка, возникшая на CON_SID "AS 'SID' RIGHT('000000' CAST(ID AS VARCHAR(6)),6)PERSISTED);";
@Override
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE " TBL_Name
" (" CON_ID "INT IDENTITY(1,1) NOT NULL PRIMARY KEY AUTOINCREMENT, "
CON_Name " TEXT, "
CON_Address " TEXT, "
CON_BDay " TEXT, "
CON_Gender " TEXT, "
CON_Course " TEXT, "
CON_SID "AS 'SID' RIGHT('000000' CAST(ID AS VARCHAR(6)),6)PERSISTED);";
db.execSQL(query);
}
Комментарии:
1. ИДЕНТИФИКАТОР, ВЕРНО, СОХРАНЯЕТСЯ, ни один из них не поддерживается SQLite.
2. Знаете ли вы какой-нибудь другой способ создать идентификатор, подобный SID00001 (идентификатор школы).
Ответ №1:
Вы не можете использовать диалект SQL MYSQL. Однако вы можете имитировать результат, используя ТРИГГЕР (не то, что вам нужно — объяснено ниже), например :-
Сначала создайте таблицу (имена на основе вашего вопроса), например :-
CREATE TABLE IF NOT EXISTS example (
id INTEGER PRIMARY KEY,
name TEXT,
address TEXT,
bday TEXT,
gender TEXT,
course TEXT,
sid TEXT UNIQUE
);
- обратите внимание, что АВТОИНКРЕМЕНТ удален, см. Ссылку
Затем добавьте ТРИГГЕР с помощью :-
CREATE TRIGGER IF NOT EXISTS example_after_insert AFTER INSERT ON example
BEGIN
UPDATE example SET sid = 'SID'||substr('000000',1,6-length(id))||id WHERE id = new.id;
END
;
Затем SID будет генерироваться всякий раз, когда вставляется строка. Например :-
/* INSERT rows where id column is generated by SQLite */
INSERT INTO example (name,address,bday,gender,course) VALUES
('name1','addr1','bday1','female','course1'),
('name2','addr2','bday2','male','course2'),
('name3','addr3','bday3','female','course3')
;
/* INSERT rows with specific ID's to test values */
INSERT INTO example (id,name,address,bday,gender,course) VALUES
(15,'name1','addr1','bday1','female','course1'),
(135,'name2','addr2','bday2','male','course2'),
(1234,'name3','addr3','bday3','female','course3'),
(98765,'name3','addr3','bday3','female','course3'),
(999999,'name3','addr3','bday3','female','course3'),
(9999999,'name3','addr3','bday3','female','course3') /* overflow */
;
Использование SELECT * FROM example;
then показывает :-
Не то, что вам нужно
Вы могли бы достичь того же результата без триггера, просто сгенерировав столбец, когда это необходимо.
- Такой подход даст следующие преимущества
- уменьшите требуемое пространство для хранения
- уменьшите обработку, требуемую при вставке строки
- нет дополнительного столбца
- нет триггера и обновления
- никакой дополнительной проверки конфликта индексов
- лучше соответствовать нормализации (не дублировать данные)
Например, чтобы получить тот же результат без доступа к столбцу sid (т. Е. Показать, Что он не нужен), вы могли бы использовать (сгенерированный столбец был назван SchoolID ):-
SELECT
id,
name,
address,
bday,
gender,
course,
'SID'||substr('000000',1,6-length(id))||id AS schoolID
FROM example;
Результат :-