Unity Android构建为Application.streamingAssetsPath中的文件提供DirectoryNotFoundException

时间:2015-06-01 18:14:21

标签: android sqlite unity3d

我正在使用SQLite嵌入式数据库处理应用程序。在编辑器和PC的构建中访问数据库没有问题。然而,当谈到Android的构建时,我在一台设备上测试它,由于某些原因我不知道是不能正常工作。

我按照一些官方论坛指南的步骤进行操作。我还添加了这个项目的plugins文件夹:

https://github.com/codecoding/SQLite4Unity3d

尽管如此,我仍然无法在构建之后运行数据库。

conn = (Applicaiton.streamingAssetsPath + "/Database.sqlite");
filepath = (Application.persistentDataPath + "/Database.sqlite");
WWW dbPath = new WWW(conn);
while (!dbPath.isDone) {}

byte[] bytes = System.IO.File.ReadAllBytes(dbPath.url);
File.WriteAllBytes(filepath, bytes);
connection = ("URI=file:" + Application.persistentDataPath + "/Database.sqlite");
dbconn = (IDbConnection)new SqliteConnection(connection);

我用ADB提取了日志数据并找到了:

06-01 22:29:05.180: I/Unity(5835): DirectoryNotFoundException: Could not find a part of the path "/jar:file:/data/app/com.Company.App-1.apk!/assets/Database.sqlite"

1 个答案:

答案 0 :(得分:0)

来自Unity manual page on streaming assets

  

请注意,在Android上,文件包含在压缩的.jar文件中(其格式与标准的zip压缩文件基本相同)。这意味着如果您不使用Unity的WWW类来检索文件,那么您将需要使用其他软件来查看.jar​​存档内部并获取该文件。

你的问题在这里:

System.IO.File.ReadAllBytes(dbPath.url);

在Android版本中,Application.streamingAssetsPath会映射到压缩的APK文件中的某个位置。 Unity的WWW类将在内部识别并处理此问题,但System.IO没有内置该行为。

您可以使用WWW类来提取文件的字节:

while (!dbPath.isDone) {}
if (!string.IsNullOrEmpty(dbPath.error)) {
    //handle www error?
} else {
    byte[] bytes = dbPath.bytes;
    //do something with the data
}

请记住,您已将此视为阻止操作,这可能会影响游戏性能。如果这是一个问题,你可以重构以异步方式处理所有这些。