2012-03-30 16 views
2

我有一個數據庫正在被用戶定義的EditTexts填充。編輯文本都不應該允許空字段。我知道我可以用幾個簡單的if語句來檢查這個:if myEditText.getText().toString().equals("") // display error。不過,我會傾向於使用這個機會來刷新我的SQLite和錯誤捕獲(如我的add方法中所演示的)。 如何將下表中的列更改爲NOT NULL,並在用戶嘗試使用空字段添加/更新時生成/捕獲錯誤?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); 

更新: 我做了一個小挖和與此想出了:

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);");

這是我所期待的?如果是這樣,我該如何利用這個優勢(見上文)?

回答

3

我不確定您是否可以實際改變表的列定義。我知道你可以改變表格本身,就像在表格中添加新的列一樣。如果您想要保留大量數據,則可能需要一些小技巧來修改數據庫。

創建新表並嘗試將數據複製到新表的方法之一,然後刪除舊錶並重命名新表。這不是最有效的方式,但它會完成工作。

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

1

編輯

在這裏你去

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); 

EDIT 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); 
+0

表中沒有任何內容,但測試行atm。我可以吹掉它並重建它沒有問題。這個問題是我完全無能爲力,因爲如何在列上實現NOT NULL。 – AnthonyW 2012-03-30 02:17:25

+0

按照上面的更新... – Mayank 2012-03-30 02:20:37

+0

優秀;我們在同一頁 – AnthonyW 2012-03-30 02:23:37

1

您需要做的就是將列設置爲NOT NULL。

然後使用

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

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

有幾種常量,你可以使用的conflictAlgorithm,這取決於你希望發生什麼。如果你不想將數據輸入到表格中,CONFLICT_IGNORE就可以解決問題。如果你想要一個讓你知道的返回碼,那麼你可以採取行動(讓用戶知道),那麼你可能需要CONFLICT_FAIL

請參閱this瞭解更多信息。

希望這會有所幫助。