2009-12-16 19 views
11

Bir userId ve not içeren bir veritabanım var. Kullanıcı, DB'de zaten bir not olup olmadığını bilmiyor, böylece bir tane yazıp 'Gönder' düğmesine tıklıyorlar. Ben KullanıcıNo zaten mevcut notu kullanıcı kimliği veya güncelleme için hiçbir not varsa bu notu eklemek istiyorum: YaniAndroid: Veri tabanı girişini eklemek ve/veya güncellemek için daha iyi bir yol var mı?

notesDb.open(); 
boolean updateResult = notesDb.updateMessage(
     userId, 
     details_notes_input.getText().toString()); 

if(updateResult == true) { 
    Log.d("databaseTester", "Updated entry into table"); 
} else { 
    Log.d("databaseTester", "FAILED to update entry into table"); 
    long insertResult = notesDb.insertMessage(
      userId, 
      details_notes_input.getText().toString()); 
    if(insertResult == -1){ 
     Log.d("databaseTester", "Failed to insert entry into table"); 
    } else { 
     Log.d("databaseTester", "Inserted entry into table"); 
    } 
} 
notesDb.close(); 

, hemen hemen bir giriş 'güncelleme' çalışılıyor ve ben o zaman başarısız olursa ben girişimi onu 'eklemek'. SQL'i çok iyi bilmiyorum, ama daha iyi bir yol olacağını düşünürdüm. Teşekkürler.

cevap

13

Bu sorunu çözmek için sqlite'ın REPLACE'u kullanabildiğiniz gibi geliyor, SQLiteDatabase.replace().

+0

Benim için çalışmadı. _getHelper(). GetWritableDatabase() öğesini denedim (TABLE_NAME, null, değerler); _ Herhangi bir öneri? –

+0

Bu işlevi, 'ContentValues' öğesinde fazladan bir parametre geçirerek 'ContentProvider 'aracılığıyla elde edebilirsiniz. Burada hakkında bir blog yazısı yazdım: [SQLite INSERT VEYA ContentProvider aracılığıyla DEĞİŞTİRİN | Buzzing Android] (http://www.buzzingandroid.com/2013/01/sqlite-insert-or-replace-through-contentprovider/) – JesperB

1

Önceki kimliğin varlığı durumunda başlatılan bir kısıtlama istisnası yakalayabilir ve ardından güncelleyebilirsiniz.

try { 
    db.insertOrThrow("sometable", null, cv); 
} catch (SQLiteConstraintException e) { 
    db.update("sometable", cv,"sometable_uid =" + id, null); 
} 
+0

Bu şekilde kontrol akışını yönetmek için istisnalar kullanmak muhtemelen iyi bir fikir değildir. Http://stackoverflow.com/a/729404/504611 adresine bakın. –

0

bu

sonucu deneyin = db.insertWithOnConflict ("tabloismi" null, ev, -1);

İlgili konular