好了,我们已经有一个加密的数据库了,不知道密码累死你也打不开。
可是,我们怎么使用这个加密库呢,这篇博文我们来看一下,读取加密数据库数据。
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,并不是使用同一个项目。