Использование SQLCipher с файлом базы данных sqlite для Android
У меня есть сброс файла базы данных в assets
файл.
Как я могу использовать SQLCipher
зашифровать базу в андроиде?
3 ответа
Это будет немного сложно. Поскольку формат файла базы данных различается в SQLite и SQLCipher для Android, и поскольку вы хотите отправить незашифрованную базу данных, вам придется сделать несколько вещей.
Во-первых, я бы получил SQLiteAssetHelper
собирается доставить незашифрованную базу данных в вашу среду.
Затем используйте стандартный SQLCipher для Android, чтобы создать пустую, но зашифрованную базу данных.
Затем вам нужно будет реализовать код, чтобы скопировать данные из упакованной, но незашифрованной базы данных и вставить ее в пустую, но зашифрованную базу данных.
Как только это будет сделано, вы можете закрыть и удалить упакованную, но незашифрованную базу данных и просто использовать зашифрованную.
Это может сделать полезное расширение SQLiteAssetHelper
когда-нибудь...
Они подробно рассказывают, как использовать SQLCipher на своем веб-сайте здесь.
По сути, вы загружаете их двоичные файлы, настраиваете их в своем проекте и затем используете их класс SQLiteDatabase вместо стандартного класса android SQLiteDatabase.
import info.guardianproject.database.sqlcipher.SQLiteDatabase;
Следующий фрагмент кода можно использовать для создания нескольких таблиц в базе данных шифра SQLite:
Используйте этот импорт:
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()
метод.