2012-03-30 9 views
2

私は、ユーザが定義したEditTextによって満たされているデータベースを持っています。空のフィールドを許可する編集テキストはありません。私は、これを2つの単純なif文で確認できます:if myEditText.getText().toString().equals("") // display error。しかし、私はこの機会を使用して、私のSQLiteをブラッシュアップし、エラーを捕まえることができます(私のaddメソッドで実証されているように)。 以下の表の列をNOT NULLに変更し、ユーザーが空のフィールドを追加/更新しようとするとエラーを生成/キャッチする方法を教えてください。SQLiteのNULLカラムではなくエラーキャッチ

私のデータベーステーブル:

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

マイaddメソッド:

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

私が探しています何本か?もしそうなら、どうやってこれを私の利点に使うことができますか?

答えて

3

実際に表の列定義を変更できるかどうかはわかりません。テーブルに新しい列を追加するなど、テーブル自体を変更することができます。保存したいデータがたくさんある場合は、データベースを修正するための小さなトリックが必要な場合があります。

新しいテーブルを作成して新しいテーブルにデータをコピーした後、古いテーブルを削除して新しいテーブルの名前を変更する方法の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 この

を試して行く。ここ

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

1

EDIT

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

+0

上記アップデートに従ってください... – Mayank

+0

優秀;私たちは同じページにいます – AnthonyW

1

列をNOT NULLに設定するだけです。

次にあなたが起こるしたい正確に何に応じて、conflictAlgorithmのために使用できるいくつかの定数があります。

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

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

を使用単純にデータをテーブルに入力しない場合は、CONFLICT_IGNOREがそのトリックを行います。リターンコードで知ってもらいたいと思ったら、それに応じて(ユーザーに知らせてください)、CONFLICT_FAILが必要になるかもしれません。

詳細については、thisを参照してください。

これが役に立ちます。

関連する問題