【问题标题】:Xamarin SQLite-net & Linked issue (duplicate column name: objectId)Xamarin SQLite-net & Linked 问题(重复的列名:objectId)
【发布时间】:2017-06-06 07:11:56
【问题描述】:

我最近迁移到 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 应用也发生了非常相似的事情,它们在同一个数据库上运行。

提前致谢!

【问题讨论】:

  • 你能找出是哪种 SQL 语言出现了重复列错误吗?您可以选择两个具有相同列名“objectId”的表。
  • 谢谢迈克。不太确定发生了什么,但我删除了对我拥有的每个 SQLite 库的所有引用并重新安装了它们。没有任何代码更改,问题很快就消失了。我也删除了跳过链接。我认为可能是我引用了 2 个无法一起使用的单独 SQLite 库。
  • 既然您解决了问题,请关闭问题。谢谢。
  • @jgoldberger 我没有足够的积分来结束一个问题。
  • 您也可以选择回答并接受您自己的回答。在搜索没有答案的问题时,只需将其从搜索结果中删除即可。 :-)

标签: xamarin xamarin.ios xamarin.android sqlite-net sqlite.net


【解决方案1】:

好的,所以我知道该怎么做以及如何克服这个问题。

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

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

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

那么现在呢?

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

[保留]属性

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

写出你的创建语句

只需做一个

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

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

【讨论】:

    猜你喜欢
    • 2016-12-09
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2023-03-19
    • 2012-09-25
    • 1970-01-01
    相关资源
    最近更新 更多