2012-03-30 5 views
2

Ich habe eine Datenbank, die von benutzerdefinierten EditTexts gefüllt wird. Keiner der Bearbeitungstexte sollte leere Felder zulassen. Ich weiß, dass ich das mit ein paar einfachen if-Anweisungen überprüfen kann: if myEditText.getText().toString().equals("") // display error. Allerdings würde ich diese Gelegenheit nutzen, um meine SQLite aufzufrischen und Fehler zu fangen (wie in meiner Add-Methode demonstriert). Wie würde ich die Spalten in der folgenden Tabelle auf NOT NULL ändern und einen Fehler generieren/abfangen, wenn ein Benutzer versucht, leere Felder hinzuzufügen/zu aktualisieren?NOT NULL Spalten in SQLite und Fehler fangen

Meine Datenbanktabelle:

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

Meine Methode add:

... füllen 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();    
} 

Meine Update-Methode:

... füllen 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: habe ich ein wenig zu graben und kam mit dieser:

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

Ist das, was ich suche? Wenn ja, wie kann ich das zu meinem Vorteil nutzen (siehe oben)?

Antwort

3

Ich bin mir nicht sicher, ob Sie tatsächlich Spalte-Definition für Tabelle ändern können. Ich weiß, dass Sie Tabelle selbst ändern können, z. B. neue Spalte zu Tabelle hinzufügen. Sie benötigen möglicherweise einen kleinen Trick, um Ihre Datenbank zu ändern, wenn viele Daten darin gespeichert werden sollen.

Ein Weg, um neue Tabelle zu erstellen und versuchen, Daten in neue Tabelle kopieren und anschließend alte Tabelle entfernen und neue Tabelle umbenennen. Es ist nicht der effizienteste Weg, es zu tun, aber es wird den Job erledigt bekommen.

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

1

EDIT

Sie hier

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 dieses

Versuchen gehen
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

Die Tabelle enthält nichts außer Testzeilen atm. Ich kann es wegblasen und es ohne Probleme wieder aufbauen. Dieses Problem ist, dass ich völlig ahnungslos bin, wie man NOT NULL für die Spalten implementiert. – AnthonyW

+0

folgen Sie dem Update oben ... – Mayank

+0

ausgezeichnet; Wir sind auf der gleichen Seite – AnthonyW

1

Alles, was Sie tun müssen, ist, die Spalten auf NOT NULL zu setzen.

verwenden Dann

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

und

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

Es gibt mehrere Konstanten, die Sie für die conflictAlgorithm verwenden können, je nach genau das, was Sie wollen passieren.Wenn Sie die Daten einfach nicht in die Tabelle eingeben wollen, ist CONFLICT_IGNORE der Trick. Wenn Sie einen Rückgabecode haben möchten, der Sie darüber informiert, damit Sie darauf reagieren können (lassen Sie den Benutzer wissen), dann könnten Sie wollen CONFLICT_FAIL.

Weitere Informationen finden Sie unter this.

Hoffe, das hilft.