hachinoBlog

hachinobuのエンジニアライフ

データをDELETEした際にROLLBACKされて無限ループになる現象

WEBシステムでiOS用のsqliteファイルを作成して、そのままiOSのアプリで使用してみた。
当然ながらCoreData特有のZ_METADATA,Z_PRIMARYKEYテーブルやZ_ENT,Z_OPTカラムも作成。
sqliteファイルを差し替えて動かすと難なく動いてくれた!
しかし、そのsqliteに対してupdateはできてもdeleteしてsaveするとアプリが固まってしまった...

sqlのログを見たところ

CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: DELETE FROM ZSUBJECTS WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZSESSIONS SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZUPDATEINFO SET ZDOWNLOADED = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: ROLLBACK

CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: DELETE FROM ZSUBJECTS WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZSESSIONS SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZUPDATEINFO SET ZDOWNLOADED = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: ROLLBACK

....無限ループ

調べたところWEBシステムで生成したsqliteファイルのZ_OPTカラムの値が0なのがいけなかったみたい。
これを1にしてあげると

CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: DELETE FROM ZSUBJECTS WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZSESSIONS SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: UPDATE ZUPDATEINFO SET ZDOWNLOADED = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: COMMIT

上記のように正常終了した。

変更回数を表すZ_OPTカラムの初期値は1のようですね。
本来であればそのデータに紐づくデータ数+1になります。
一応、動く事は確認できたけど危険かなぁ...