由于某些原因,我无法将软件的SQLite数据库从“ asset”文件夹复制到其他目标位置。使用我正在使用的“ copyDatabaseFromAssets()”方法,它只会生成一个空文件。我确实整理了以下代码,以使我可以更轻松地找到错误消息。
由于我的想法不高,I used an old article from ReignDesign.com稍微调整了数据库文件。我也碰巧使用的是2016版的SQLDroid,看起来确实可以正常工作。
该文件位于“〜/ assets / database / test.db”中。
这是我正在使用的基本代码:
public class AndroidLauncher extends AndroidApplication {
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
copyDatabaseFromAssets( this, "test.db", true );
}
/**
* Copy database file from assets folder inside the apk to the system database path.
* @param context Context
* @param databaseName Database file name inside assets folder
* @param overwrite True to rewrite on the database if exists
* @return True if the database have copied successfully or if the database already exists without overwrite, false otherwise.
*/
private boolean copyDatabaseFromAssets( Context context, String databaseName, boolean overwrite ) {
File outputFile = context.getDatabasePath( databaseName );
if ( outputFile.exists() && !overwrite ) {
return true;
}
outputFile = context.getDatabasePath( databaseName + ".temp" );
outputFile.getParentFile().mkdirs();
try {
InputStream inputStream = context.getAssets().open( databaseName );
OutputStream outputStream = new FileOutputStream( outputFile );
// transfer bytes from the input stream into the output stream
byte[] buffer = new byte[ 1024 ];
int length;
while ( ( length = inputStream.read( buffer ) ) > 0 ) {
outputStream.write( buffer, 0, length );
}
// Close the streams
outputStream.flush();
outputStream.close();
inputStream.close();
outputFile.renameTo( context.getDatabasePath( databaseName ) );
} catch ( IOException e ) {
if ( outputFile.exists() ) {
outputFile.delete();
}
return false;
}
return true;
}
}
谢谢。
答案 0 :(得分:1)
您的db文件位于子文件夹内,从子文件夹获取文件的更好方法就是更改此行
InputStream inputStream = context.getAssets().open( databaseName );
收件人:
InputStream inputStream = context.getAssets().open("database/" + databaseName);
希望它将对您有帮助!