memahami pembaruanDenganOnConflict

Saya bekerja dengan database sederhana. Ini memiliki tiga kolom. _id (peningkatan otomatis kunci utama bilangan bulat), nomor pekerjaan (teks unik bukan nol) dan bagian pekerjaan (teks bukan nol).

Semuanya berfungsi dengan baik sampai saya mencoba memperbarui catatan dan memasukkan nomor pekerjaan yang ada. Ketika saya melakukan itu, aplikasi mogok dan saya terpaksa menutupnya.

Saya menggunakan updateWithOnConflict dan saya pikir itu menyebabkan semuanya keluar dengan baik dan mengembalikan kode. Tidak yakin apakah saya hanya tidak mengerti atau apakah saya telah melakukan sesuatu yang salah...

Bantuan apa pun dihargai.

perbarui cuplikan kode:

    public int updateJob(long rowId, String jobnumber, String jobpart) {
        ContentValues args = new ContentValues();
        args.put(JOB_NUMBER, jobnumber);
        args.put(JOB_PART, jobpart);

        return mDb.updateWithOnConflict(JOB_TABLE, args, JOB_ROWID + "=" + rowId, null, SQLiteDatabase.CONFLICT_ROLLBACK);
    }

keluaran dari LogCat:

FATAL EXCEPTION: main
android.database.sqlite.SQLiteException: cannot commit - no transaction is active
at android.database.sqlite.SQLiteStatement.native_executeSql(Native Method)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:89)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1933)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1864)
at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:688)
at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:266)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96)
at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1829)
at cdc.gridtest.ScheduleDBAdapter.updateJob(ScheduleDBAdapter.java:325)
at cdc.gridtest.JobEdit.saveState(JobEdit.java:104)
at cdc.gridtest.JobEdit.access$0(JobEdit.java:90)
at cdc.gridtest.JobEdit$1.onClick(JobEdit.java:47)
at android.view.View.performClick(View.java:3110)
at android.view.View$PerformClick.run(View.java:11934)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4123)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)

person Barak    schedule 21.01.2012    source sumber


Jawaban (1)


Saya rasa masalahnya adalah Anda menggunakan flag SQLiteDatabase.CONFLICT_ROLLBACK tetapi Anda tidak menggunakan transaksi. Anda harus membuat transaksi atau memasukkan CONFLICT_IGNORE sebagai tanda dalam pemanggilan metode Anda.

person Yury    schedule 21.01.2012
comment
Itu memang solusinya. Karena semua pekerjaan dari aplikasi ini akan dilakukan satu baris pada satu waktu, saya tidak memerlukan apa pun selain CONFLICT_IGNORE (sesuatu yang tidak terlalu saya pertimbangkan sampai Anda membuat saya memikirkannya dengan jawaban Anda). Terima kasih! - person Barak; 22.01.2012