Android 開発 - SQLite データベース

  データをファイルに保存する方法については前に説明しましたが、この方法とは別に、皆さんご存知のとおり、一般的にデータはデータベースに保存されます。

  データをデータベースに保存する利点:

    1) データベースに保存されたデータの追加、削除、変更、確認などの操作がより便利になります。

    2) 銀行振込等のトランザクションのロールバックが実現できます。

    3) メンテナンスが容易で可読性が高い

    4) リソース使用量が少なく、パフォーマンスが高い

    5)……

  SQLite データベースは、私たちの日常生活のどこにでも存在します。たとえば、携帯電話などです。現在市販されている携帯電話は、データ ストレージとして SQLite データベースを使用しています。

  また、私たちがよく目にするスマート ホームも SQLite データベースを使用してデータを記録します。QQ、Thunder など、私たちがよく使うデスクトップ プログラムも同様です。

1. SQLiteデータベースの概念とメリット・デメリット

  SQLite データベースはオープンソースの組み込みデータベース エンジンであり、その各データベースは単一のファイルの形式で存在します。

  これらのデータは、B ツリー データ構造の形式でディスクに保存されます。

  SQLite データベースは開いて直接実行できる小さなファイルですが、他のデータベースは大きなアプリケーションです。

  SQLite を使用する利点:

    1. SQLite はほとんどの SQL 標準ステートメントをサポートします

      追加、削除、変更、確認、トランザクションなど、ここでは詳しく説明しません...

    2. 軽量

      ポケットサイズと言えますが、小さな SQLite は最大 2TB のサイズのデータ​​ベースをサポートできます

    3. 高速な検索速度

    4. 動的データモデル(弱い型)

      SQLiteデータベースのサポート

        NULL: 空の値

        INTEGER: 整数型

        REAL: 浮動小数点

        TEXT: 文字列テキスト

        BLOB: バイナリオブジェクト

      5 つの基本的なデータ型。

      「弱い型」と呼ばれる理由は、どのようなデータ型であっても、データを挿入するときに自動的に変換されるためです。

      注: INTEGER の制約が PRIMARY KEY である場合、それは整数である必要があり、自動的に変換されません。そうでない場合は、エラーが報告されます。

    5. SQLite データベースは、使用前にインストールして構成する必要はなく、プロセスがデータベースを開始および終了できるようにする必要もありません。

    6. システムリソースの占有量が少ない

    7. クロスプラットフォーム

      特定のオペレーティング システム用に個別にコードを記述する必要がなく、複数のオペレーティング システムで使用できます。つまり、各オペレーティング システムのデータ層は同じです。

      同時に、SQLite データベースの内部メカニズムによっても決定され、SQL データベースは SQLite 仮想マシン上で実行されます。

      仮想マシン上では、これは直接変換され、さまざまなオペレーティング システムのデータ モデルにコンパイルされます。

  SQLite の欠点は次のとおりです。

    1. 大規模なプロジェクトはサポートされていません

    2. 一部の SQL 標準ステートメントはサポートされていませんが、これらのステートメントは通常は使用されません...

    3. 他の大規模データベースに比べてセキュリティが劣る

      Android スマートフォンと比較すると、root 権限を取得している限り、やりたいことが何でもできることがわかります。

      では、Android はどのようにしてセキュリティを強化しているのでしょうか?

        a. プログラムのセキュリティ検証を改善する

        b. 規範の厳密性を強化する

        c. 権限管理

 

  SQLite データベースの利点により、多くのデスクトップ アプリケーションはアプリケーションのデータを保存するために SQLite データベースを使用しています。

  もちろん、当社の Android および iPhone の製品チェーンはほぼすべて SQLite データベースを使用しています。

 

2. Androidでの実装

   1. ネイティブ メソッドを使用してデータベース上で単純な操作を実行する

    つまり、SQL コードを直接記述します。

    a. メソッドを定義し、SQLiteOpenHelper クラスを継承します。そして、onCreate メソッドと onUpgrade メソッドを実装し、カスタム メソッドをオーバーライドします。

      カスタム メソッドをオーバーライドします。

        1) 多くのパラメーターがあるため、ここでは単に context パラメーターのみが必要です。

        2) スーパーパラメータ:

          コンテキスト: コンテキスト

          名前: データベース名

          ファクトリ: カーソルオブジェクトを作成する目的

          version: データベースのバージョン、通常は 1 から始まります

      onCreate メソッド:

        1) データベースを初めて作成するときに使用され、2 回目の場合は開かれます。

        2) テーブル構造の初期化に適しています

      onUpgrade方法:

        1) データベースのバージョンアップ時に使用します。

        2) テーブル構造の更新に適しています

      実行SQL:

        実行するSQL文が追加、削除、変更に適している

 

コードをコピーする
public class MyOpenHelper extends SQLiteOpenHelper { 

    /** 
     * 
     * @param context context 
     * name データベースの名前
     * カーソルオブジェクトを作成するファクトリの目的
     * version データベースのバージョンは 1 から始まります
     */ 
    public MyOpenHelper(Context context) { 
        super(context, "test_1. db ", null, 3); 
    } 

    /** 
     * データベースを初めて作成する場合
     * このメソッドは、テーブル構造の初期化に特に適しています。テーブルの作成は SQL ステートメントを書くことです
     */ 
    @Override 
    public void onCreate (SQLiteDatabase db) { 

        db. execSQL("create table test_info(id integer Primary key autoincrement,name varchar(20))"); } / ** 
    *

    データベース
     のバージョンがアップグレードされた場合に使用されます
     * このメソッドはテーブルの更新に適しています構造
     */
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

        db.execSQL("alter table test_info add Phone varchar(20)"); 
    } 

}
コードをコピーする

 

    b. データベースのダウングレード、ダウングレードの主要な設計ポイントに注意を払う必要があります。

      1) ユーザー[カスタムデータ、行動習慣]を保存するためにクラウドを検討します。専門用語のプロファイル – >>ユーザーの粘度を向上させる

      2) 現在の最小バージョン要件を考慮する –>>メンテナンスコストを削減する

      3) 可能な限りローカル データ転送 (すべての新しいバージョンではフィールドは削除されません) –>可能な限り未知のものを既知のものに変える

      4) ダウングレードは失敗する可能性が高いため、通常は try-catchを使用します。ダウングレードが成功した場合は try ブロックのステートメントが実行され、失敗した場合は catch ブロックのステートメントが実行されます。

      5) SQLiteDatabase (実行文)、oldVersion (旧バージョン番号)、newVersion (新バージョン番号)

 

コードをコピーする
/* シミュレーションは 3.0 から 2.0 に減少します */ 
    @Override 
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
        //通常、2.0 より大きい場合、test_info テーブルとフィールドが存在するはずです2.0 のものはすべて 3.0 のものです はい
        try { 
            //まず、test_info の将来のテーブルの名前を変更します
            String rename_sql = "alter table test_info rename to test_info_bak"; 
            db.execSQL(rename_sql); 
            Log.i("down", "1.名前が正常に変更されました") ; 
            //次に、2.0 テーブル構造を作成します
            String sql_message = "create table test_info (id int Primary key, tou1 varchar(50), userName varchar(50), lastMessage 
                    varchar(50), datetime varchar(50) )"; db.execSQL(sql_message); Log.i("ダウン", "2.2.0 テーブル構造が正常に作成されました"); //3 番目に、新しく作成した 2.0 テーブルにバックアップ データをコピーします String sql_copy = "insert into test_info select id,tou1,userName,lastMessage,datetime from test_info_bak"; db.execSQL(sql_copy); Log.i(" down", "3. ユーザー データを 2.0 テーブルにコピーします"); // 4 番目、バックアップ テーブルを削除します String drop_sql = "テーブルが存在する場合は削除します test_info_bak"; db.execSQL(drop_sql); Log.i(" down", "4. Dropバックアップ テーブル"); } catch (Exception e) { //Failure Log.i("hi", "ダウングレードに失敗しました、再確立"); String sql_drop_old_table = "テーブルが存在する場合は削除します test_info "; String sql_message = "create table test_info(id integer 主キー autoincrement,name varchar(20),phone varchar(20))"; String sql_init_1 = "test_info 値に挿入 (1,'abc','130000')"; String sql_init_2 = "test_info 値に挿入 (2,'abc','134444')"; db.execSQL(sql_drop_old_table); db.execSQL(sql_message); db.execSQL(sql_init_1); db.execSQL(sql_init_2); } }
コードをコピーする

 

    c. MyOpenHelper オブジェクトを作成する

 

myOpenHelper = new MyOpenHelper(getApplicationContext()); 

//データベースを初めて作成する場合は開くか作成し、次に
//SQLiteDatabase を開きます sqliteDatabase = myOpenHelper.getWritableDatabase(); 
//データベースが最初の場合は開くか作成します初めて作成し、ディスクがいっぱいの場合は開いて読み取り専用で返します。
//SQLiteDatabase sqliteDatabase = myOpenHelper.getReadableDatabase();

 

    d. データを増やす

 

//データベース オブジェクトを取得
SQLiteDatabase db = myOpenHelper.getWritableDatabase(); 
//SQL ステートメントを実行して追加
db.execSQL("insert into test_info(name,phone) names(?,?)",new Object[]{" zhangsan" ,"138888888"}); 
// データベースが使い果たされたら閉じる
db.close();

 

    e. データの削除

 

SQLiteDatabase db = myOpenHelper.getWritableDatabase(); 
db.execSQL("name=? の test_info から削除",new Object[]{"zhangsan"}); 
db.close();

 

    f. データを変更する

 

SQLiteDatabase db = myOpenHelper.getWritableDatabase(); 
db.execSQL("updata test_info setphone=? where name=?",new Object[]{"13777777777","zhangsan"}); 
db.close();

 

    g. データのクエリ

 

コードをコピーする
SQLiteDatabase db = myOpenHelper.getWritableDatabase(); 

        カーソル Cursor = db.rawQuery("select * from test_info", null); 

        if(cursor!=null&&cursor.getCount()>0){ 
            while(cursor.moveToNext()){ 
                //columnIndex 代表列のインデックス
                文字列 name =cursor.getString(1); 
                文字列電話 = カーソル.getString(2); 
            } 
        }
コードをコピーする

 

 

  2. Google がパッケージ化した API を使用して、データに対して簡単な操作を実行します

    Google のエンジニアは、直接呼び出せるようにいくつかのメソッドをパッケージ化しましたが、実際には、これらの文字列は最下層で完全な SQL ステートメントに結合されます。

 

    a. データを増やす

      ContentValues 内にカプセル化されたマップ コレクション。<key, value> の形式でデータを保存します。

      パラメータの説明を挿入

        テーブル: テーブル名

        key: 対応する列の名前

        値: 対応する値

      パラメータの説明を入力します

        key: 追加された列名

        値: 対応する値

 

コードをコピーする
//データベース オブジェクトを取得
SQLiteDatabase db = myOpenHelper.getWritableDatabase(); 
/** 
* テーブル テーブル名
* ContentValues はマップを内部にカプセル化します
* キー: 対応する列の名前   
* 値: 対応する値
*/ 
ContentValues values = new ContentValues(); 
values.put("name", "wangwu"); 
values.put("phone", "120"); //戻り値は、
挿入
された新しい行の ID を表します。= db.insert("test_info", null,values );//最下層は SQL ステートメントを結合しています
//データベースが使い果たされたら閉じます
db.close(); 

if(insert>0){ 
    Toast.makeText( getApplicationContext(), "追加に成功しました!", 3000).show() ; 
}else{ 
    Toast.makeText(getApplicationContext(), "追加に失敗しました!", 3000).show(); 
}
コードをコピーする

 

    b. データの削除

      パラメータの説明を削除する

        テーブル: テーブル名

        whereClause: 削除する内容に応じて、どの列を削除するか

        whereArgs: ここで返されるのは、削除された列の値に応じた配列オブジェクトです。

 

SQLiteDatabase db = myOpenHelper.getWritableDatabase(); 
//Google のパッケージ化された API に従って削除
int delete = db.delete("test_info", "name=?", new String[]{"wangwu"}); 
db.close( ) ; 
Toast.makeText(getApplicationContext(), "削除された "+delete+" 行", 2000).show();

 

    c. データを変更する

      パラメータの説明を更新します

        テーブル: テーブル名

        value: ContentValues の値です。

        whereClause: どのような変更に応じてどの列を変更するか

        whereArgs: 変更された列の値に応じた配列オブジェクトです。

 

コードをコピーする
SQLiteDatabase db = myOpenHelper.getWritableDatabase(); 

//Google のパッケージ化された API に従って ContentValues を変更します value = new ContentValues(); value.put("phone", "110"); //更新された行数を表します int updata = db .update("test_info", value, "name=?", new String[]{"wangwu"}); db.close(); Toast.makeText (getApplicationContext ( ), "updated"+updata+"line "、2000).show();
コードをコピーする

 

    d. データのクエリ

      クエリパラメータの説明

        テーブル: テーブル名

        列: クエリの列

        選択: どのクエリによるか

        selectionArgs: クエリ条件の値

        groupBy: グループ化

        being: クエリ条件。ここでは、have と where の違いを区別する必要があります。

        orderBy: 並べ替え

      moveToNext(): データテーブル内のデータを走査します。

      カーソル: Google エンジニアによってカプセル化されたポインタ オブジェクト。コレクションの添字をトラバースするために使用されます。

 

コードをコピーする
SQLiteDatabase db = myOpenHelper.getWritableDatabase(); 
        
/** 
 * Google のパッケージ化された API に基づくクエリ
* 列はクエリする列を表します
* 選択内容に基づいて電話番号をクエリします
*/ 
Cursor カーソル = db.query("test_info", new String [ ]{"phone"}, "name=?", new String[]{"wangwu"}, null, null, null); if(cursor!=null &&cursor.getCount()>0){ while( 

cursor 
     . moveToNext( )){ 
    
    
          String Phone =cursor.getString(0); 
          System.out.println("phone:" + Phone); 
     } 
}
コードをコピーする

 

 

  3. ネイティブ メソッドとパッケージ化された API メソッドを使用する利点と欠点

    a. ネイティブメソッドの利点

      1) SQL ステートメントをより柔軟に使用できるようになります

      2) コード量が削減でき、効率が向上します。

    b. ネイティブメソッドの欠点

      1) 間違った SQL コードを書きやすい

      2) メンテナンスが容易ではない

    c. 適切な梱包の利点

      1) SQL ステートメントを直接記述する必要がないため、エラーの可能性が減少します。

      2) メンテナンスが容易

    d. 適切な梱包のデメリット

      1) プログラムをより複雑にし、効率を低下させる

      2) データ操作が不便で、データ操作文を柔軟に利用できない

    どの方法を使っても一長一短があるので、実際の開発では状況に応じてどの方法を使っても構いません。

    提案: 小規模なプログラムの場合は、比較的シンプルで開発効率を向上できるパッケージ化された API を使用することをお勧めします。

       比較的大規模なプログラムにはネイティブ メソッドを使用することをお勧めします。ネイティブ メソッドはより柔軟で、プログラムの効率も向上します。

 

3. まとめ

  1. SQLite を使用するメリットとデメリット

  2. データベースのアップグレードとダウングレード (*****)

  3. ネイティブ メソッドを使用してデータベース上で簡単な操作を実行する

  4. Google がパッケージ化した API を使用して、データベースに対して簡単な操作を実行します

  5. それぞれのメリットとデメリット

  6. Android と iPhone の製品チェーンのデータ層は同じです

  

 

  ps: 興味のある学生は WeChat について考えてみてください:

    SQLite はクライアント側でどのように実装されますか?

    バックグラウンドサーバーでそれを実現するために何が使用され、どのように実現されるのでしょうか?

    では、これらのデータの相互作用はどうなるのでしょうか?

    最適化するにはどうすればよいでしょうか?

 

おすすめ

転載: blog.csdn.net/qq_33505204/article/details/78451839