6

ファイルでデータベース ファイルをリセットしましたassets

SQLCipherAndroidでデータベースを暗号化するにはどうすればよいですか?

4

3 に答える 3

9

これは少し複雑になります。SQLite と Android 用 SQLCipher ではデータベース ファイル形式が異なるため、暗号化されていないデータベースを出荷する場合は、いくつかの操作を行う必要があります。

まず、SQLiteAssetHelper暗号化されていないデータベースを環境に配信します。

次に、標準の Android 用 SQLCipher を使用して、空の暗号化されたデータベースを作成します。

次に、パッケージ化されているが暗号化されていないデータベースからデータをコピーして、空のが暗号化されているデータベースに挿入するコードを実装する必要があります。

それがすべて完了したら、パッケージ化されているが暗号化されていないデータベースを閉じて削除し、暗号化されたデータベースのみを使用できます。

SQLiteAssetHelperこれは、いつか...の便利な拡張機能になるかもしれません...

于 2012-05-01T14:57:01.170 に答える
2

SQLCipher の使用方法については、こちらの Web サイトで詳しく説明しています。

基本的に、バイナリをダウンロードしてプロジェクトにセットアップし、標準の Android SQLiteDatabase クラスの代わりに SQLiteDatabase クラスを使用します。

 import info.guardianproject.database.sqlcipher.SQLiteDatabase;
于 2012-05-01T14:48:23.493 に答える
1

次のコードの抜粋を使用して、SQLite Cipher データベースに複数のテーブルを作成できます。

次のインポートを使用します。

import java.sql.SQLException;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import android.content.ContentValues;  
import android.content.Context;  
import android.database.Cursor;  
import android.util.Log;

/** Helper to the database, manages versions and creation */

    public class DBAdapter extends SQLiteOpenHelper {
        private static final String DATABASE_NAME = "Test";
        private static final int DATABASE_VERSION = 1;

        // Table name
        public static final String TABLE_1 = "Table1";
        public static final String TABLE_2 = "Table2";

        // Column names for Table1 table
        static final String KEY_PASSWORD = "password";
        static final String KEY_USER = "user";

        // Column names for Table2 table
        static final String KEY_EVENT = "event";
        static final String KEY_USERNAME = "username";


        public DBAdapter(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            String sql1 = "create table " + Table_1 + " (" + KEY_USER + " text primary key, " + KEY_PASSWORD + " text not null);";
            String sql2 = "create table " + Table_2 + " (" + KEY_EVENT + " text primary key, " + KEY_USERNAME + " text not null FOREIGN KEY(" + KEY_USERNAME + ") REFERENCES " + TABLE_1 + "(" + KEY_USER + "));";
            db.execSQL(sql1);
            db.execSQL(sql2);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            if (oldVersion >= newVersion){
                return;
            }

            String sql = null;
            if (oldVersion == 1) 
                sql = "alter table " + TABLE_1 + " add note text;";
            if (oldVersion == 2)
                sql = "";

            Log.d("EventsData", "onUpgrade  : " + sql);
            if (sql != null)
                db.execSQL(sql);
        } 

        public Cursor getAllUsers(String username, SQLiteDatabase db){
            return db.query(TABLE_1, ...);
        }

        public Cursor getAllEvents(String event, SQLiteDatabase db){
            return db.query(TABLE_2, ...);
        }
   }

これで、両方のテーブルに対してすべての CRUD メソッドを実行できます。メソッドに示されているように、各メソッドにSQLiteDatabase引数としてがあることを確認してくださいgetAllUsers()

于 2012-08-26T11:32:19.157 に答える