1

我最近转向 SQLite-net,因为它支持 Android 7.0 中的新变化,但它给我带来了重大问题。我认为它与链接器有关,但不太确定如何处理该问题。

首先,如果在调试和发布中构建我的应用程序,它可以完美运行。没有问题。如果我随后归档我的应用程序(生成签名的 APK),它会根据链接器设置在不同的点开始崩溃。

如果我将我的应用程序设置为使用 SDK 和用户程序集构建,我的应用程序会立即崩溃。这是日志的一部分:-

Caused by: android.runtime.JavaProxyThrowable: SQLite.SQLiteException: duplicate column name: objectId
                                                 at SQLite.SQLite3.Prepare2 (SQLitePCL.sqlite3 db, System.String query) [0x0001e] in <1096ddd2a2894a619279903f1fa07799>:0 
                                                 at SQLite.SQLiteCommand.Prepare () [0x00011] in <1096ddd2a2894a619279903f1fa07799>:0  

如果我将我的应用程序设置为仅使用 Sdk,它的工作方式会有所不同。它实际上启动了应用程序,下载了一半的数据。如果我尝试通过添加更多来更新数据,它会崩溃。然后,该应用程序将在每次启动时崩溃,直到我删除该应用程序的整个本地存储,然后它才能完美运行。

我也读过关于跳过链接程序集的文章,在这种情况下,我跳过了所有与 SQL 相关的库。

--linkskip=SQLite-net --linkskip=SQLite.NET --linkskip=SQLite.Net.Platform.XamarinAndroid --linkskip=SQLite.Net.Platform.XamarinAndroidN --linkskip=SQLiteNetExtensions --linkskip=SQLitePCLRaw.batteries_green --linkskip=SQLitePCLRaw.batteries_v2 --linkskip=SQLitePCLRaw.core --linkskip=SQLitePCLRaw.lib.e_sqlite3 --linkskip=SQLitePCLRaw.provider.e_sqlite3 

有没有人对如何解决这个问题有任何想法。我想尽快发布一个应用程序,但无法解决这个问题。我的 iOS 应用程序也发生了非常相似的事情,它们在同一个数据库上运行。

提前致谢!

4

1 回答 1

1

好的,所以我发现了该做什么以及如何克服这个问题。

如果您遇到此问题,很可能是因为您正在基于模型创建表。在许多情况下,这是一件明智的事情。但请注意,这是使用反射。在 github 的 FAQ 中值得注意:

因为 sqlite-net 使用反射,MT 链接器无法识别它需要各种属性。然后它将这些属性从类中剥离出来。

https://github.com/praeclarum/sqlite-net/wiki/FAQ

所以现在怎么办?

在我看来,你有两个选择。

[保留] 属性

当谈到这种方法时,我不是很有经验。事实上,我还没有真正找到好的文档来引导我完成它。所以我真的不能对此发表评论。

写出你的创建语句

只需做一个

connection.Execute("create table ....."); 

这将允许您创建没有重复列的表,从而使用链接器。万岁!

于 2017-02-19T15:23:11.533 回答