文件已加密或不是数据库:Android中的SQLCipher

文件已加密或不是数据库:Android中的SQLCipher,android,sqlite,sqlcipher,sqlcipher-android,Android,Sqlite,Sqlcipher,Sqlcipher Android,我使用以下方法从Linux命令行加密了一个SQLite数据库 $ ./sqlcipher plaintext.db sqlite> ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'MyPass123'; sqlite> SELECT sqlcipher_export('encrypted'); sqlite> DETACH DATABASE encrypted; 我确实把加密的数据库放在我的Android项目的assets文件

我使用以下方法从Linux命令行加密了一个SQLite数据库

$ ./sqlcipher plaintext.db
sqlite> ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'MyPass123';
sqlite> SELECT sqlcipher_export('encrypted');
sqlite> DETACH DATABASE encrypted;
我确实把加密的数据库放在我的Android项目的assets文件夹中,并按照以下方式复制它

InputStream mInput = mContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream mOutput = new FileOutputStream(outFileName);
byte[] mBuffer = new byte[1024];
int mLength;
while ((mLength = mInput.read(mBuffer)) > 0) {
    mOutput.write(mBuffer, 0, mLength);
}
mOutput.flush();
mOutput.close();
mInput.close();
但当我试图打开这个数据库时,我得到了一个错误“文件被加密或不是数据库”。我使用的密钥和我在命令行上加密它时使用的密钥相同

以这种方式打开数据库

String mPath = DB_PATH + DB_NAME;   

mDataBase = SQLiteDatabase.openDatabase(mPath, "MyPass123", null, SQLiteDatabase.CREATE_IF_NECESSARY);

我遗漏了什么吗?

确认您可以使用
sqlcipher
工具从命令行打开数据库。另外,将
mOutput
设置为
FileOutputStream
,并在
flush()
之后和
close()
之前调用
getFD().sync()
,以确保在开始尝试使用SQLCipher访问数据库之前,所有字节都已写入磁盘。另外,不要硬编码路径(如果
DB_PATH
是硬编码的),也不要使用字符串连接来创建路径。是的,我可以使用命令行sqlcipher工具打开文件:)