データを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になります。
一応、動く事は確認できたけど危険かなぁ...