android–sqlcipher_export没有导出我的表

android–sqlcipher_export没有导出我的表,第1张

概述我使用sqlciper与android加密现有的sqlite数据库,并遇到加密数据库不包含我的表的问题,它只包含sqlite_master和android_metadata.我原来的db看起来像:shell@umts_spyder:/sdcard$sqlite3d000000.datsqlite3d000000.datSQLiteversion3.7.4Enter".help"forinstructions @H_301_0@我使用sqlciper与android加密现有的sqlite数据库,并遇到加密数据库不包含我的表的问题,它只包含sqlite_master和androID_Metadata.

@H_301_0@我原来的db看起来像:

@H_301_0@

shell@umts_spyder:/sdcard $sqlite3 d000000.datsqlite3 d000000.datsqlite version 3.7.4Enter ".help" for instructionsEnter sql statements terminated with a ";"sqlite> select * from sqlite_master;select * from sqlite_master;table|androID_Metadata|androID_Metadata|2|CREATE table androID_Metadata (locale TEXT)table|PageData|PageData|3|CREATE table PageData(file_Path TEXT NOT NulL UNIQUE, file_Content BLOB)index|sqlite_autoindex_PageData_1|PageData|4|
@H_301_0@我在下面粘贴我的加密代码,使用空键(“”)打开普通数据库,如果使用null,则引发NullPointerException(对于我在帖子末尾提到的两个普通数据库):

@H_301_0@

file plain = new file(mDbPath); /* /sdcard/d0000000.dat */file encrypt = new file(plain.getParent(), "encrypted.dat");encrypt.delete();sqliteDatabase db = sqliteDatabase.openorCreateDatabase(mDbPath, "", null);String sql = String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s'", encrypt.getPath(), mvKey.getText().toString()); // key is qqqqqqqqdb.execsql(sql);db.rawquery("SELECT sqlcipher_export('encrypted')", null);db.execsql("DETACH DATABASE encrypted");
@H_301_0@以下是我用来测试加密数据库的代码,输出中只有“androID_Metadata”,我的表PageData丢失了.如果我直接使用“select * from PageData”,它不会引发这样的表异常:

@H_301_0@

file file = new file(Environment.getExternalStorageDirectory(), "encrypted.dat");if(!file.exists()){    mvbrowse.setText("not exist");    return;}String key = mvKey.getText().toString();sqliteDatabase db = sqliteDatabase.openorCreateDatabase(file, key, null);Cursor cursor = db.rawquery("SELECT * FROM sqlite_master", null);String str = new String();while(cursor.movetoNext()){    str += cursor.getString(1)+", ";}mvbrowse.setText(str); // output is "androID_Metadata, "cursor.close();db.close();
@H_301_0@加密应该工作,因为如果我用empty(“”)键打开encrypted.dat,它会引发“文件加密或不是数据库”异常,但我可以用正确的密钥读取sqlite_master和androID_Metadata表.

@H_301_0@我确认我测试的路径与我编写的加密路径相同;

@H_301_0@使用空键测试由sqlcipher创建普通数据库:

@H_301_0@

sqliteDatabase db = sqliteDatabase.openorCreateDatabase(file, "", null); /* /sdcard/d000000.dat */db.execsql("CREATE table PageData(file_Path TEXT NOT NulL UNIQUE, file_Content BLOB)");
@H_301_0@以及通过标准的sqlite工具创建它(sqlite Export Professional,在这种情况下我没有使用BLOB字段,只有TEXT和INTEGER);

@H_301_0@并测试了两个API版本,“sqlCipher for AndroID v2.2.2”和“sqlCipher for AndroID v3.0.0”.

@H_301_0@我还尝试将http://sqlcipher.net/sqlcipher-api/中描述的Decrypt程序应用于加密的数据库.

@H_301_0@以上都得到了相同的结果.有人会帮助我吗?我相信里面有一些小错,但我无法弄明白.

解决方法:

@H_301_0@最后,我通过从https://github.com/sqlcipher/sqlcipher-android-tests/blob/master/src/main/java/net/zetetic/tests/ImportUnencryptedDatabaseTest.java学习来解决我的问题.问题是,在执行加密过程时,必须不要使用execsql或rawquery,而是使用新引入的方法“rawExecsql.要清楚,以下代码工作正常:

@H_301_0@

    String sql = String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s'", encrypt.getPath(), mvKey.getText().toString());    db.rawExecsql(sql);    db.rawExecsql("SELECT sqlcipher_export('encrypted')");    db.rawExecsql("DETACH DATABASE encrypted");
总结

以上是内存溢出为你收集整理的android – sqlcipher_export没有导出我的表全部内容,希望文章能够帮你解决android – sqlcipher_export没有导出我的表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1110457.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存