簡體   English   中英

將 SQLCipher 與 android 附帶的 sqlite 數據庫文件一起使用

[英]using SQLCipher with android shipped sqlite database file

我在assets文件中重置了一個數據庫文件。

如何使用SQLCipher在 android 中加密數據庫?

這會有點復雜。 由於 SQLite 和適用於 Android 的 SQLCipher 的數據庫文件格式不同,並且由於您想要發布未加密的數據庫,因此您必須做一些事情。

首先,我會使用SQLiteAssetHelper將未加密的數據庫傳送到您的環境中。

然后,使用適用於 Android 的標准 SQLCipher 創建一個空但已加密的數據庫。

接下來,您需要實現代碼以將數據從打包但未加密的數據庫中復制出來,並將其插入到空但已加密的數據庫中。

全部完成后,您可以關閉並刪除打包但未加密的數據庫,然后僅使用加密的數據庫。

這可能會成為SQLiteAssetHelper的有用擴展,有一天......

其中包括如何在其網站上使用SQLCipher詳細這里

基本上你下載他們的二進制文件,在你的項目中設置它們,然后使用他們的 SQLiteDatabase 類而不是標准的 android SQLiteDatabase 類。:

 import info.guardianproject.database.sqlcipher.SQLiteDatabase;

以下代碼摘錄可用於在 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()方法中所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM