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没有导出我的表所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)