データのストレージとアクセス - SQLite データベースも参照


このセクションの紹介:

前のセクションを学習した後、あなたはすでに Android での SQLite の基本操作をマスターしているので、このセクションでは学習します。 少し高度な内容、データベース トランザクション、大規模なバイナリ データをデータベースに保存する方法、バージョンをアップグレードする場合 データベースの扱い方!さて、このセクションを始めましょう!


SQLite トランザクション

1.png

簡単に言うと、トランザクションに書き込まれたすべてのデータベース操作は成功し、トランザクションはコミットされます。それ以外の場合、トランザクションはロールバックされます。これは、前の時点に戻ることを意味します。 ステータス - データベース操作が実行されていないとき。さらに、先ほども述べましたが、data/data/<パッケージ名>/database/ ディレクトリ内にあります。 作成した db ファイルの他に、データベースがトランザクションをサポートできるようにするために xxx.db-journal ファイルも使用されます。 一時ログ ファイルが生成されました。


2.SQLite は大きなバイナリ ファイルを保存します

もちろん、一般的に、画像、オーディオ、ビデオなどの大きなバイナリ ファイルをデータベースに保存することはめったにありません。 はストレージ ファイルのパスですが、ある日突然これらのファイルをデータベースに保存したいという場合が常にあります。 画像は一例です。画像を SQLite に保存し、SQLite で画像を読み込んでください。

2.png


3.SimpleCursorAdapter はデータベース データをバインドします

もちろん、これは楽しむのには問題ありませんが、使い方は非常に簡単ですが、使用することはお勧めしません。 実際、ContentProvider について話すとき、連絡先リストをバインドするためにこれを使用しました。ここでは例は書きません。 コアコードに直接アクセスしてください。さらに、必要に応じて自分でいじることもできます。現在では、データベースに関するものを自分で作成することはほとんどありません。 、通常はサードパーティのフレームワークを使用します: ormlite、greenDao など。高度な部分では、もう一度学びます~

3.png


4. データベースアップグレードのハイライト

PS: そうですね、私はこの部分を実行しませんでした。しかし、それは常にプロジェクトの経験が不足しているためです。私が会社を訪問したばかりの会社の製品はすべてポジショニングベースです。 このプロジェクトでは、前任者が残したコードが次のとおりであることがわかりました。onCreate() で DB を作成し、onUpgrade() で前の DB を削除し、 onCreate() メソッドをもう一度呼び出してください。いくつかのバージョンのコードを読んだ後、データベースのアップグレード操作がないことがわかりました。学ぶべきことは何もありません。 他の人の実践を参照することしかできません。以下は Xiaozhu の情報のレビューからの結論です。何か間違っている場合は、ご指摘ください。 もしかしたら、サードパーティのフレームワークによってはすでにこれが行われているかもしれませんが、時間の制約があるため、ゆっくりとは説明しません。ご存知の場合はメッセージを残していただけますと幸いです。

1) データベースのバージョンアップとは何ですか?アップグレードするにはどうすればよいですか?

回答: APP を開発してデータベースを使用する場合、データベースのバージョンは v1.0 であると想定します。 このバージョンでは、x.db データベース ファイルを作成し、onCreate() メソッドを通じて最初のテーブルを作成しました。 t_user、そこには 2 つのフィールドがあります: _id、user_id; 後で今度はフィールド user_name を追加します。 データベーステーブルの構造を変更する必要があり、onUpgrade() を使用してデータベースを更新できます。 このメソッドでは、カスタム SQLiteOpenHelper をインスタンス化するときにバージョン番号を変更するだけです (1 を 2 に変更するなど)。 このようにして、onUpgrade() メソッドが自動的に呼び出されます。さらに、データベースのバージョンごとに適切な作業を行う必要があります。 対応するレコード (ドキュメント) は次のようになります:

データベース バージョンandoid 対応バージョンcontent
v1.01最初のバージョンには 2 つのフィールドが含まれています。 .
v1.12データ保持、新しい user_name フィールド

2) いくつかの質問と関連する解決策

① アプリケーションをアップグレードすると、データベース ファイルは削除されますか?

答え: いいえ!データも何もかもそこにあります!

②テーブル内のフィールドを削除したり、新しいフィールドを追加したい場合、元のデータはまだ残っていますか?

答え: はい!

③先ほど言った、データを保持せずにデータベースのバージョンを更新する荒っぽい方法ですが、投稿してもらえますか?

A: はい、ここではサードパーティの ormlite が使用されています。データベースの作成と削除のコードを自分で書くこともできます:

4.png

④たとえば、サードパーティにアップグレードした場合。バージョンでは、2 番目のバージョンにテーブルを追加しました。その後、3 番目のバージョンにもテーブルが追加され、最初のバージョンから 3 番目のバージョンに直接アップグレードされたユーザーが追加されたため、 は 2 番目のバージョンを経由しませんでした。追加されたテーブルはありません。どうすればこれを破ることができますか?

答え: とても簡単です。onUpgrade() の中に switch() を書くことができます。データベースがバージョン間でアップグレードされるたびに確実にアップグレードされます。 すべての変更を実装できます。これにより、テーブル構造が確実に最新の状態になります。また、必ずしもテーブルの作成やテーブル構造の変更を行う必要はありません。 それも大丈夫です!


⑤ 古いテーブルのデザインが悪すぎて、多くのフィールドを変更する必要があり、変更が多すぎます。新しいテーブルを作成したいのですが、テーブル名は同じでなければなりませんと。以前のデータの一部を新しいテーブルに保存する必要があります。

答え: はい、もちろん解決策はあります:

1. 古いテーブルの名前を一時テーブルに変更します。

ALTER TABLE User RENAME TO _temp_User; 2. 新しいテーブルの作成:CREATE TABLE User (u_id INTEGER PRIMARY KEY,u_name VARCHAR(20),u_age VARCHAR(4));

3. INSERT INTO User SELECT u_id,u_name,"18" FROM _temp_User; //元のテーブルがない場合は、デフォルト値を自分で設定する必要があります

4. 一時テーブルを削除します;DROP TABLE_temp_User;

このセクションの概要:


このセクションでは、SQLite トランザクションとラージ バイナリ ストレージ、SimpleCursorAdapter、およびデータベースのアップグレードについて説明します。 いくつかの問題は検討されており、SQLite について、サードパーティの使用について、今のところ非常に多くのことを学びました。 上級レベルに達したら、いくつかの高度なトピックを一緒に勉強します~このセクションはこれで終わりです、ありがとう~