使用SQLCipher与android发布的sqlite数据库文件

时间:2012-05-01 14:37:30

标签: java android sqlcipher

我在assets文件中重置了数据库文件。

如何使用SQLCipher加密android中的数据库?

3 个答案:

答案 0 :(得分:9)

这会有点复杂。由于Android的SQLite和SQLCipher之间的数据库文件格式不同,并且由于您要发送未加密的数据库,因此您必须做一些事情。

首先,我得到SQLiteAssetHelper,将未加密的数据库传送到您的环境。

然后,使用Android的标准SQLCipher创建一个空的但加密的数据库。

接下来,您需要实现代码以将数据从打包但未加密的数据库中复制出来并将其插入空的但加密的数据库中。

完成所有操作后,您可以关闭并删除已打包但未加密的数据库,只需使用加密的数据库即可。

这可能会对SQLiteAssetHelper进行有用的扩展,有一天......

答案 1 :(得分:2)

它们涵盖了如何在其网站here

上详细使用SQLCipher

基本上你下载他们的二进制文件,在你的项目中设置它们然后使用他们的SQLiteDatabase类而不是标准的android SQLiteDatabase类。:

 import info.guardianproject.database.sqlcipher.SQLiteDatabase;

答案 2 :(得分: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()方法所示。