我正在使用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"
答案 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
}
请记住,您已将此视为阻止操作,这可能会影响游戏性能。如果这是一个问题,你可以重构以异步方式处理所有这些。