ホームページ  >  記事  >  データベース  >  IOS データベースのアップグレードとデータ移行の詳細な例

IOS データベースのアップグレードとデータ移行の詳細な例

小云云
小云云オリジナル
2017-12-25 14:09:071977ブラウズ

この記事では、主に IOS データベースのアップグレードとデータ移行の詳細な例に関する関連情報を紹介します。データベースのアップグレードとデータ移行の問題を解決するのに役立つ例を示します。

IOS データベースのアップグレード データ移行の詳細な例

概要:

私はずっと前にデータベースのバージョン アップグレードの参照シナリオに遭遇しました。当時のアプローチは、単純に古いデータベース ファイルを削除して、データベースを再構築することでした。データベースとテーブルの構造を考慮すると、この乱暴なアップグレード方法は古いデータの損失につながるため、新しいプロジェクトでデータベースを使用する場合は、この問題を再考する必要があると思います。この問題を解決するためのより洗練された方法を使用することは、将来的には同様のシナリオに遭遇することになるでしょう。

理想的な状況は、データベースのアップグレード、テーブル構造、主キーと制約の変更後、データが古いテーブルから自動的に取得され、同じフィールドがマッピングされて移行されることです。ほとんどのビジネス シナリオでのデータベース バージョンのアップグレードには、フィールドの追加または削除と主キー制約の変更のみが含まれるため、以下で実装するソリューションも、最も基本的で一般的に使用されるビジネス シナリオに基づいています。より複雑なシナリオについては、実行できます。それはここにあります あなたの期待に応えるためにベースを拡張してください。

選択と完了

オンラインで検索したところ、データベースのアップグレードとデータ移行のためのシンプルで完全な解決策はありませんでしたが、いくつかのアイデアを見つけました

1. 古いデータを削除してテーブルを再構築します

利点: シンプル
欠点:データ損失

2. 既存のテーブルに基づいてテーブル構造を変更します

利点: データを保持できます
欠点: ルールが面倒です データベースフィールド構成ファイルを作成してから、構成ファイルを読み取って実行する必要があります。 SQLの変更 テーブルの構造、制約、主キーなど、複数のバージョンにまたがるデータベースのアップグレードとなると、面倒で面倒になります

3. 一時テーブルを作成し、古いデータを一時テーブルにコピーして削除します。古いデータテーブルを削除し、一時テーブルをデータテーブルとして設定します。

利点: データを保持でき、テーブル構造の変更、および制約と主キーの変更をサポートできます。
欠点: 実装には多くの手順が必要です。 3 番目の方法は、より信頼性の高い解決策です。

主な手順

この考えに従って、データベースのアップグレードを分析しました。主な手順は次のとおりです:

データベース内の古いテーブルを取得します
  • テーブル名を変更し、サフィックス「」を追加します_bak" を使用して古いテーブルを置き換えます テーブルはバックアップ テーブルとして使用されます
  • 新しいテーブルを作成します
  • 新しく作成されたテーブルを取得します
  • 古いテーブルと新しいテーブルを走査し、比較して抽出します移行する必要があるテーブルのフィールド
  • データ移行処理
  • バックアップテーブルの削除

  • 使用されるSQL文の分析
これらの操作はデータベース操作に関連しているため、問題の鍵となるのはステップに対応する SQL ステートメントを以下に示します。 ステートメント:

SELECT * from sqlite_master WHERE type='table'

結果は次のとおりです。 | name | tbl_name | rootpage | データベース名フィールドを変更し、古いテーブルをバックアップとして使用するだけです。 table


sqlite> SELECT * from sqlite_master WHERE type='table'
 ...> ;
+-------+---------------+---------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| type | name   | tbl_name  | rootpage | sql                                                     |
+-------+---------------+---------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| table | t_message_bak | t_message_bak | 2  | CREATE TABLE "t_message_bak" (messageID TEXT, messageType INTEGER, messageJsonContent TEXT, retriveTimeString INTEGER, postTimeString INTEGER, readState INTEGER, PRIMARY KEY(messageID))        |
| table | t_message  | t_message  | 4  | CREATE TABLE t_message (
 messageID TEXT, 
 messageType INTEGER,
 messageJsonContent TEXT, 
 retriveTimeString INTEGER, 
 postTimeString INTEGER, 
 readState INTEGER, 
 addColumn INTEGER,
 PRIMARY KEY(messageID)
) |
+-------+---------------+---------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 行于数据集 (0.03 秒)

テーブルフィールド情報を取得します


-- 把t_message表修改为t_message_bak表 
ALTER TABLE t_message RENAME TO t_message_bak

これらのデータベースがあることを確認します。フィールドの場合は、フィールド名である名前のみを使用する必要があります。


-- 获取t_message_bak表的字段信息
PRAGMA table_info('t_message_bak')

データ移行処理にはサブクエリを使用します



sqlite> PRAGMA table_info('t_message_bak');
+------+--------------------+---------+---------+------------+------+
| cid | name    | type | notnull | dflt_value | pk |
+------+--------------------+---------+---------+------------+------+
| 0 | messageID   | TEXT | 0  | NULL  | 1 |
| 1 | messageType  | INTEGER | 0  | NULL  | 0 |
| 2 | messageJsonContent | TEXT | 0  | NULL  | 0 |
| 3 | retriveTimeString | INTEGER | 0  | NULL  | 0 |
| 4 | postTimeString  | INTEGER | 0  | NULL  | 0 |
| 5 | readState   | INTEGER | 0  | NULL  | 0 |
+------+--------------------+---------+---------+------------+------+
6 行于数据集 (0.01 秒)

messageID、messageType、messageJsonContent、retrieveTimeString、postTimeString の値をコピーします。 、t_message_bak テーブルの readState を t_message テーブルに変換します

コードの実装

次に、コードの実装手順です


INSERT INTO t_message(messageID, messageType, messageJsonContent, retriveTimeString,
 postTimeString, readState) SELECT messageID, messageType, messageJsonContent, retriveTimeString,
 postTimeString, readState FROM t_message_bak

関連する推奨事項:

sql 2005 データベースのアップグレード 2008 データベースと 2005 データの添付ファイル 200 8 データバックアップ記事

SQLサーバーデータベースのバージョンアップ問題解決方法


OracleデータベースをMySQLに移行する方法の詳細まとめ(画像とテキスト)

以上がIOS データベースのアップグレードとデータ移行の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。