Kobito が起動しなくなった場合の対処（読み込み中のままハング）

## TL;DR

色々切り分けてみたところ、**最後に保存したデータが原因で Kobito が起動しなくなった**場合、バックアップから復旧してみてください。

```bash:Kobitoの自動バックアップ先
$ cd ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/Backups
```

1. 壊れたDBにあって、正常に起動する DB にないデータを SQLite3 の DB から直接コピー
2. 正常に起動するDBで Kobito を起動し、新規作成アイテムにコピーを貼り付ける


## TS;DR

Kobito を起動すると読み込み中のままハングしている場合、恐らく以下の切り分けをすでに試されていると思います。

- アプリを再インストールをすると起動する（データは空）
- バックアップした最後のデータを復旧させると NG
- １つ古いデータだと起動する（しかし、大事な直近のデータが消えたまま）

その上で、**最後に編集したデータが原因でハングしている**と思われる場合は、SQLite3 で保存されている Kobito のデータベースを直接編集してデータを復旧させます。

※ macOS（OSX） をベースに記事を書いていますが、Windows でも基本的に流れは同じだと思います。

### Kobito のデータが保存されているパス（バックアップ／復元先のファイル）

> ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/

以下はディレクトリ構造を [`tree`コマンド](https://www.google.co.jp/search?q=site:qiita.com+mac+tree+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)で表示した例です。

```bash:Kobitoフォルダのディレクトリ構造
$ cd ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/
$ tree
.
├── Kobito.db
├── Kobito.db-shm
├── Kobito.db-wal
├── CSS
│   └── custom-style.css
│
└── Backups
    ├── Kobito 2.3.8 2018-05-07 175832.db-backup
    │   ├── Kobito.db
    │   ├── Kobito.db-shm
    │   └── Kobito.db-wal
    ├── Kobito 2.3.8 2018-05-08 210550.db-backup
    │   ├── Kobito.db
    │   ├── Kobito.db-shm
    │   └── Kobito.db-wal
    │
    （以下同文）
```

### Kobito のバックアップ・ディレクトリ

> ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/Backups

```bash:バックアップ・ディレクトリの構造
$ cd ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/
$ cd Backups
$ tree
.
├── Kobito 2.3.8 2018-05-07 175832.db-backup
│   ├── Kobito.db
│   ├── Kobito.db-shm
│   └── Kobito.db-wal
├── Kobito 2.3.8 2018-05-08 210550.db-backup
│   ├── Kobito.db
│   ├── Kobito.db-shm
│   └── Kobito.db-wal
│
（以下同文）
```
```text:バックアップ・ディレクトリ名のフォーマット
Kobito x.x.x yyyy-yy-yy yyyyyy.db-backup

x = Kobito のバージョン
y = バックアップの日付
```

### バックアップからの復元

バックアップ・ディレクトリ内の各日付ごとのディレクトリにある下記３つのファイルを差し替えると、バックアップから復元できます。

- `/Kobito.db`
- `/Kobito-shm.db`
- `/Kobito-wal.db`

### SQLite コマンドで DB 内を手動でデータ検索

```bash
$ cd ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/
$ cd Backups
$ ls
$ cd "Kobito x.x.x yyyy-yy-yy yyyyyy.db-backup"
$ 
$ sqlite3 Kobito.db
sqlite> .help
<略>
sqlite> .version
SQLite 3.16.0 2016-11-04 19:09:39 0e5ffd9123d6d2d2b8f3701e8a73cc98a3a7ff5f
sqlite> .dumb %ZITEM%
<略>
sqlite> .quit
```
上記のようにコマンドラインを利用してもいいのですが該当データを探すのが大変です。やはり GUI で探しコピペした方が楽で間違いもないため SQLite 用の DB ブラウザ・アプリを利用します。（もちろんコマンドに慣れている方はコマンドで）

> 「DB Browser for SQLite」（Mac, Win, PortableApp版あり）
> http://sqlitebrowser.org/

<img width="100%" alt="Kobito_DBBrowser.png" src="https://qiita-image-store.s3.amazonaws.com/0/78776/84ce2752-fb54-f213-bbe5-75f757323c5f.png">

1. 「DB Brower for SQLite」アプリを開き「Open Database」から壊れた方の DB（Kobito.db）を開く。<br>Kobito のフォルダを Finder の「よく使う項目」に登録しておくと開くのが楽になります。
2. 「Browse Data」タブを選び、ドロップダウンから「ZITEM」を選ぶと記事一覧が表示されます。
3. 左側ペインの表で「ZRAW_BODY」列と「ZTITLE」列を見ながら復旧したいアイテムを探します。
4. 選択すると右上のペインに内容が表示されるので、コピーしてどこかに避難しておきます。
5. アプリを終了し、Kobito のDB（３つのファイル）を正常に起動するものに差し替えます。
6. Kobito を起動し、新しいアイテムを作成後、先に避難したコピーデータを貼り付け、問題がありそうな箇所がないか確認して保存します。
7. Kobito を再起動して問題がないようであれば、急ぎの作業を続けます。




---
## 検証環境
|Kobito|OS|Hard|
|:--:|:--:|:--:|
| v.2.3.8 |macOS Sierra<br>（OSX 10.12.6）|MacBookPro Early 2015, Mem 8GB|