android数据临时存储数据库,GitHub - xiaoraoli/GreenDaoExample: Android GreenDao使用总结(包括模型生成、增删改查、修改存储路径、数据库更新升级...

GreenDaoExample

数据库模型生成及读取操作

采用注释方式生成数据库模型,并对数据库进行读写操作。

修改数据库文件路径

默认情况下,新创建的数据存储在data的包名目录下,设备如果不root的话,是无法查看SQLite数据库文件的。而实际应用中,我们往往需要copy数据库,或借用第三方工具查阅或编辑数据库内容。此时我们可以通过重写Context的getDatabasePath(String name)、openOrCreateDatabase(String name, int mode, CursorFactory factory)、openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler)等三个方法来修改SQLite文件的存储路径。

获取加密的数据库

通过调用DaoMaster.OpenHelper类的getEncryptedWritableDb(password)或者getEncryptedReadableDb(password)方法,即可获取加密的数据库。

数据库升级又不删除数据

在实际开发的过程中,数据库的结构可能会有所改变。而使用DevOpenHelper每次升级数据库时,表都会删除重建。因此,实际使用中需要建立类继承 DaoMaster.OpenHelper,实现 onUpgrade()方法。

通过查询资料,对未加密的数据库,推荐使用升级辅助库GreenDaoUpgradeHelper。

该库通过 MigrationHelper在删表重建的过程中,使用临时表保存数据并还原。

MigrationHelper.migrate(),暂时只接收 SQLiteDatabase ,不接收 Database,且对加密的数据库是无效的。而实际应用中,由于数据的重要性,数据库往往是必须要加密的。

解决方案如下:添加一个新类继承DaoMaster.OpenHelper,添加构造函数并重写onUpgrade和getEncryptedWritableDb方法。同时修改MigrationHelper为EncryptedMigrationHelper。MyEncryptedSQLiteOpenHelper代码如下:

private static class MyEncryptedSQLiteOpenHelper extends DaoMaster.OpenHelper {

private final Context context;

private final String name;

private final int version = DaoMaster.SCHEMA_VERSION;

private boolean loadSQLCipherNativeLibs = true;

public MyEncryptedSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {

super(context, name, factory);

this.context=context;

this.name=name;

}

private static final String UPGRADE="upgrade";

@Override

public void onUpgrade(Database db, int oldVersion, int newVersion) {

EncryptedMigrationHelper.migrate((EncryptedDatabase) db,AreaDao.class, PeopleDao.class, ProductDao.class);

Log.e(UPGRADE,"upgrade run success");

}

@Override

public Database getEncryptedWritableDb(String password) {

MyEncryptedHelper encryptedHelper = new MyEncryptedHelper(context,name,version,loadSQLCipherNativeLibs);

return encryptedHelper.wrap(encryptedHelper.getReadableDatabase(password));

}

private class MyEncryptedHelper extends net.sqlcipher.database.SQLiteOpenHelper {

public MyEncryptedHelper(Context context, String name, int version, boolean loadLibs) {

super(context, name, null, version);

if (loadLibs) {

net.sqlcipher.database.SQLiteDatabase.loadLibs(context);

}

}

@Override

public void onCreate(net.sqlcipher.database.SQLiteDatabase db) {

MyEncryptedSQLiteOpenHelper.this.onCreate(wrap(db));

}

@Override

public void onUpgrade(net.sqlcipher.database.SQLiteDatabase db, int oldVersion, int newVersion) {

MyEncryptedSQLiteOpenHelper.this.onUpgrade(wrap(db), oldVersion, newVersion);

}

@Override

public void onOpen(net.sqlcipher.database.SQLiteDatabase db) {

MyEncryptedSQLiteOpenHelper.this.onOpen(wrap(db));

}

protected Database wrap(net.sqlcipher.database.SQLiteDatabase sqLiteDatabase) {

return new EncryptedDatabase(sqLiteDatabase);

}

}

}

初始化代码如下:

MyEncryptedSQLiteOpenHelper helper = new MyEncryptedSQLiteOpenHelper(context,"test.db",null);

daoMaster = new DaoMaster(helper.getEncryptedWritableDb("1234"));//获取可读写的加密数据库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值