НЕ NULL столбцы в SQLite и отлов ошибок - PullRequest
2 голосов
/ 30 марта 2012

У меня есть база данных, которая заполняется пользовательским EditTexts. Ни один из редактируемых текстов не должен содержать пустых полей. Я знаю, что могу проверить это с помощью пары простых операторов if: if myEditText.getText().toString().equals("") // display error. Однако я предпочел бы использовать эту возможность, чтобы освежить свой SQLite и перехват ошибок (как показано в моем методе добавления). Как мне изменить столбцы в таблице ниже на NOT NULL и создать / перехватить ошибку, когда пользователь пытается добавить / обновить пустые поля?

Моя таблица базы данных:

db.execSQL("CREATE TABLE inventory (category TEXT, itemNum TEXT, quantity INTEGER, price REAL, image INTEGER, UNIQUE(category, itemNum) ON CONFLICT FAIL);");

Мой метод добавления:

... заполнить ContentValues values

try{
db.getWritableDatabase().insertWithOnConflict(DatabaseHelper.TABLE_NAME, DatabaseHelper.CATEGORY, values, SQLiteDatabase.CONFLICT_FAIL);
fillItemNumbers();          
}
catch(SQLiteConstraintException e)
{
Toast
.makeText(MyActivity.this, etItemNum.getText().toString() + " already exists in " +     catSpinner.getSelectedItem().toString() +". Consider using Update.",Toast.LENGTH_LONG)
.show();            
}

Мой метод обновления:

... заполнить ContentValues values

String[] args = {catSpinner.getSelectedItem().toString(), etItemNum.getText().toString()};
int rowsAffected = db.getWritableDatabase().update(DatabaseHelper.TABLE_NAME, values, DatabaseHelper.CATEGORY + "=? AND " + DatabaseHelper.ITEM_NUMBER + "=?" , args);

UPDATE: Я немного покопался и придумал это:

db.execSQL("CREATE TABLE inventory (category TEXT NOT NULL, itemNum TEXT NOT NULL, quantity INTEGER NOT NULL, price REAL NOT NULL, image INTEGER NOT NULL, UNIQUE(category, itemNum) ON CONFLICT FAIL);");

Это то, что я ищу? Если так, как я могу использовать это в своих интересах (см. Выше)?

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

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

Один из способов создать новую таблицу и попытаться скопировать данные в новую таблицу, а затем удалить старую таблицу и переименовать новую таблицу. Это не самый эффективный способ сделать это, но он сделает работу.

http://www.sqlite.org/lang_altertable.html

1

EDIT

Вот, пожалуйста,

CREATE TABLE inventory (category TEXT not null, itemNum TEXT not null, quantity INTEGER not null, price REAL not null, image INTEGER not null, UNIQUE(category, itemNum) ON CONFLICT FAIL);

РЕДАКТИРОВАТЬ 2 Попробуйте это

CREATE TABLE inventory (category TEXT not null ON CONFLICT FAIL, itemNum TEXT not null ON CONFLICT FAIL, quantity INTEGER not null ON CONFLICT FAIL, price REAL not null ON CONFLICT FAIL, image INTEGER not null ON CONFLICT FAIL, UNIQUE(category, itemNum) ON CONFLICT FAIL);
1 голос
/ 30 марта 2012

Все, что вам нужно сделать, это установить для столбцов значение NOT NULL.

Тогда используйте

insertWithOnConflict(String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm)

и

updateWithOnConflict(String table, ContentValues values, String whereClause, String[] whereArgs, int conflictAlgorithm)` 

Есть несколько констант, которые вы можете использовать для алгоритма конфликта, в зависимости от того, что именно вы хотите сделать. Если вы хотите просто не вводить данные в таблицу, CONFLICT_IGNORE поможет. Если вам нужен код возврата, сообщающий вам, чтобы вы могли действовать с ним (сообщите пользователю), тогда вы можете захотеть CONFLICT_FAIL.

См. это для получения дополнительной информации.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...