2012-01-21 3 views
2

저는 간단한 데이터베이스로 작업하고 있습니다. 세 개의 열이 있습니다. _id (정수 기본 키 autoincrement), jobnumber (text 고유 not null) 및 jobpart (text not null).understandingWithOnConflict를 이해하십시오.

레코드를 시도하고 기존 작업 번호를 입력 할 때까지 모든 것이 제대로 작동합니다. 내가 그 일을하면 애플 리케이션이 충돌하고 강제로 닫습니다.

저는 updateWithOnConflict를 사용하고 있습니다. 정상적으로 종료하고 코드를 반환해야한다고 생각했습니다. 내가 이해하지 못했거나 잘못했는지 확실하지 않은 경우 ...

도움을 주시면 감사하겠습니다.

업데이트 코드 : 로그 캣에서

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

출력 :

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) 

답변

4

난 당신이 SQLiteDatabase.CONFLICT_ROLLBACK 플래그를 사용하지만 당신은 트랜잭션을 사용하지 않는 것이 문제라고 생각합니다. 트랜잭션을 만들거나 CONFLICT_IGNORE을 메서드 호출의 플래그로 넣어야합니다.

+0

실제로 그게 해결책이었습니다. 이 앱의 모든 작업은 한 번에 한 행씩 수행되므로 CONFLICT_IGNORE (내가 당신의 답을 생각할 때까지 고려하지 않은 것) 이외의 다른 작업은 필요 없습니다. 감사! – Barak

관련 문제