iwanghang

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

好了,我们已经有一个加密的数据库了,不知道密码累死你也打不开。

可是,我们怎么使用这个加密库呢,这篇博文我们来看一下,读取加密数据库数据。

0、导包

compile 'net.zetetic:android-database-sqlcipher:3.4.0@aar'

1、首先,我们把要未加密的数据库放在项目中

\SqlEncrypt\app\src\main\res\raw\my_database.db

2、接下来,我们来看下java代码

2.1、MyDatabaseHelper

package com.xxx.sqldecrypt;

import android.content.Context;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteDatabase.CursorFactory;
import net.sqlcipher.database.SQLiteOpenHelper;

public class MyDatabaseHelper extends SQLiteOpenHelper {

    public static final String CREATE_TABLE = "create table Book(name text, pages integer)";

    public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {

    }

}

2.2、MainActivity

package com.xxx.sqldecrypt;

import android.database.Cursor;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import net.sqlcipher.database.SQLiteDatabase;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

    private String TAG = "MainActivity";
    private String baoName = "com.xxx.sqldecrypt";
    File dbFile = new File("/data"
            + Environment.getDataDirectory().getAbsolutePath()
            + "/" + baoName + "/databases/");
    String dbPath = "/data"
            + Environment.getDataDirectory().getAbsolutePath()
            + "/" + baoName + "/databases/my_database.db";// 要把你Raw文件的db保存到sdcard中

    String passphrase = "123456";
    private SQLiteDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initPublicDB(); // 初始化数据库

        SQLiteDatabase.loadLibs(this);
        MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "my_database.db", null, 1);
        db = dbHelper.getWritableDatabase(passphrase);

        Cursor cursor = db.query("book_2018", null, null, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String name = cursor.getString(cursor.getColumnIndex("name"));
                Log.d("TAG", "book_2018 name is " + name);
            }
        }

    }

    /**
     * 初始化数据库
     */
    private void initPublicDB() {
        if (!dbFile.exists()) { // 如果文件夹不存在,则创建新的文件夹
            dbFile.mkdirs();
        }
        if (!(new File(dbPath).exists())) {  //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库
            Log.v(TAG, "导入数据库到/" + baoName + "/databases/");
            InputStream is = getResources().openRawResource(R.raw.my_database); // 要导入的数据库
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(dbPath);
                byte[] buffer = new byte[1024];
                int count = 0;
                while ((count = is.read(buffer)) > 0) {
                    fos.write(buffer, 0, count);
                }
                fos.flush();
                fos.close();
                is.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Log.v(TAG, "initPublicDB = " + (new File(dbPath).exists()));
    }
}

3、完事了,我们把加密数据库(my_database.db)放在新的工程里,然后遍历了表(book_2018表的name字段)。

4、注意,我们上一篇加密工程是com.xxx.sqlencrypt,而本篇解密工程是com.xxx.sqldecrypt,并不是使用同一个项目。

posted on 2018-02-27 14:15  iwanghang  阅读(1055)  评论(0编辑  收藏  举报