- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在当前正在编写的一个小应用程序中使用 Android 和 ORMLite。该应用程序的目标是具有有效的导入/导出功能,为此我使用简单的 XML 框架。在某种程度上,一切都运转良好。
情况如下:对象 A 包含引用对象 B 的外键,对象 B 通过外键本身引用对象 C。导出数据库很棒。导入工作,有一个小警告,即只要所有对象的 ID 都是连续的并且从 1 开始,它就可以工作。但是如果数据库是 fragment 化的,即我在导出数据库后到处删除了一条记录,我在生成的 XML 结构中存在“漏洞”。示例对象可以是:
@DatabaseTable("orders")
public class Order {
@DatabaseField(generatedId = true)
private int _id;
@DatabaseField(columnName="date")
private Date _date;
@DatabaseField(columnName="cost")
private double _cost;
@DatabaseField(foreign = true, columnName="customer_id")
private Customer _customer;
// ... more fields, getters and setters
}
@DatabaseTable("customers")
public class Customer {
@DatabaseField(generatedId = true);
private int _id;
@DatabaseField
private String _name;
// ... more fields, getters and setters
}
假设我有一个包含 2 个客户(id 1 和 2)的数据库,分别保存从 1 到 5 和 6 到 8 的订单。导出该数据库然后重新导入到干净的数据库中效果很好。但是,如果我删除客户 1 及其订单并将其导出,导出商将按原样写入其 ID,即
<customer id="2">...</customer>
和
<order id="6">...</order>
<order id="7">...</order>
<order id="8">...</order>
<order id="9">...</order>
等等。当我将数据导入新数据库时,我首先通过保存客户对象
custDao.create((Customer)x);
然后他们的每个订单通过
orderDao.create((Order)o);
问题是创建函数忽略了提供的 id(不是 0),而新生成的客户 id 是 1(在新的空数据库中)。订单也一样。但由于他们引用了 id=2 的客户,因此他们之间的链接被破坏了。
因此,在这个有点冗长的解释之后,我的问题是:有没有办法告诉 ORMLite 获取 generatedId 字段提供的值并使用它运行,而不是覆盖它?如果创建函数在表中找到具有相同 ID 的行时生成任何异常,我会没事的,但会继续保存记录,否则...我想到了一个解决方法:所有对象都应该可以使用 Comparator 接口(interface)按 ID 排序;使用要导入的对象对 ArrayList 进行排序;对于每个对象 - 将假定的 id 读入 int, - 使用 dao.create 保存到数据库, - 如果对象的新 id 与假定的 id 不同,则通过 dao.updateId 更改它, - 移动到列表中的下一个对象。 .但这看起来太麻烦而且容易出错:如果 create 方法尝试生成一个 id,而您刚刚使用 updateId 将其重新分配给以前的对象,该怎么办?
我不相信我的情况如此罕见,以至于没有人遇到过这种情况。我希望有一个解决方案!
最诚挚的问候,托多尔
最佳答案
ORMLite支持allowGeneratedIdInsert=true
选项 @DatabaseField
允许将 ID 已设置到生成 ID 表中的对象插入的注释。如果 ID 字段的值为空或默认值(0,...),则数据库将生成 ID。并非所有数据库类型都支持此功能(例如 Derby)。这是another discussion关于这个特定主题。
我确实认为这里正确的做法是在内存中构建对象图,关联正确的 Customer
在他们的Order
上对象在将其中一个保存到磁盘之前。如果您将客户读入内存,请读入 Order
对象并设置真实的Customer
对象对每一个。当您创建每个 Customer
时数据库中的对象,ORMLite 会更改id
字段到生成的字段,这将在 customer_id
上更改它字段保存在每个Order
中也是如此。
如果您有大量数据并且无法一次将其全部读入内存(或由于某种其他原因),那么您始终可以构建一个 Map<Integer,Integer>
并保存Customer
XML 中的 id 映射到您在数据库中创建后获得的 id。然后当您加载Order
时对象,您可以在外部对象上设置新的更正 ID。
希望这有帮助。让我了解有关如何读取对象的更多详细信息,我可以提供有关如何构建对象图的更好示例。
关于java - 我可以暂时暂停 ORMLite 中自动生成的 ID 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5216663/
我在 Window 2008 x64 上的 IIS 7 下托管了一个网站。 IIS 以 64 位模式运行,该站点有自己的 64 位应用程序池等。该网站大部分时间似乎运行良好,然后每小时突然卡住用户请求
我有一个 imageView 并希望它像这样工作: ImageViewer可见 5秒暂停 ImageView 不可见 5秒暂停 ImageViewer可见 等等... 我该怎么做?我试过 sleep
我在我的 JavaScript 函数中使用了下面的代码。我想在 10 秒后调用这个函数。然而该函数立即被触发!?!不确定发生了什么。 function testing() { //oth
我想暂停计时器,点击按钮后我想继续计时器计数...我搜索但找不到与此相关的功能.. 怎么办? 最佳答案 您将需要一个变量来跟踪自 Chronometer 启动以来耗时: long timeWhenSt
我目前有一个程序可以从麦克风收集声音信号并在 python 上实时显示波形。对于 matplotlib funcanimation,我正在尝试通过这种方式向我的程序添加一些暂停和启动按钮或功能。但它没
我有一个由套接字提供的热Observable。我可以使用pausable暂停套接字供稿。但是一旦“取消暂停”可观察对象,就需要显示套接字在暂停订阅时可能发送的最后一个值。我不想跟踪套接字手动发送的最后
我知道这是可能的,但我还没有找到方法,所以我在问。 在播放 3rd 方音乐(例如 Spotify)时开始在我的应用程序中播放 mp3 声音时。 Spotify 暂停,您必须恢复 Spotify,让它再
我正在尝试使用 iPhone 的前置摄像头录制有声视频。因为我还需要支持暂停/恢复功能,所以我需要使用 AVAssetWriter .我在网上找到了一个用 Objective-C 编写的示例,它几乎实
我知道互斥锁可以作为一种实现,但是我想知道是否有一种方法可以像视频播放一样暂停/恢复另一个线程。当其他正在运行的线程很复杂时,此方法更易于编程。 最佳答案 SIGTSTP是用于暂停进程的信号,如果您有
到目前为止,我已经看到了以下停止动画的技术,但我在这里寻找的是旋转 View 停止在当前的角度,而不是返回到 0。 struct DemoView: View { @State private
我一般在问有关多线程的问题。例如我锁定了一个互斥锁并恢复任务,然后我想挂起它,我的问题是,我应该在挂起之前解锁互斥锁吗?这样当我再次使用互斥锁恢复它时,它会成功恢复吗? 我刚刚开始使用多线程的东西,我
我有2个缩略图链接,单击它们时,它们会以灯箱样式打开视频。我的目标是让它们在打开时播放,在关闭时暂停(单击背景区域时关闭)。 我的HTML代码在这里: M
到目前为止,我没有将我发现的几种不同方法拼凑在一起: http://192.185.121.49/~steveobr/ 我需要所有的语音演示像第一个“商业”一样工作 正如您在实时示例中看到的那样,每个
所以我正在制作某种游戏,玩家可以在其中获得一些能力。玩家回合结束后,服务器应有 5 秒的超时时间,其中不执行任何代码,然后在该时间后结束回合。但是,如果客户端单击其中一项电源,服务器应停止 5 秒超时
我尝试将自己的方法添加到 Tween 类中以暂停/恢复所有补间。这就是我所拥有的: createjs.Tween.pauseAllTweens = function() { for ( var
我对 Azure 搜索标准级别的成本有疑问。是否可以将 Azure 搜索级别从标准更改为基本?是否可以暂时暂停 Azure 搜索标准?我在门户中没有看到此控件。我是否需要将 Azure 搜索实现重新创
如何用相同的代码制作play/Pause按钮。 - (IBAction)min:(id)sender { NSString *path = [[NSBundle mainBundle] pathF
我知道这很可能超出了沙箱范围,但我还是想问一下: 我想在我的应用程序中放置一个“暂停/播放”按钮,以暂停或播放任何背景音频。基本上,我希望实现在多任务栏中找到的播放/暂停按钮。 一个简单的例子是有人用
我正在制作一款编程游戏,玩家可以在其中对盟友的行为进行编程。玩家为给定的盟友编写decide()函数的主体,可以用任何java代码填写,但必须返回一个 Action 。我想为每个盟友提供一组有限的每个
我有功能 1 用于播放音乐,第二个用于设置实际音乐的暂停,我的暂停功能不起作用。我该如何设置暂停? function play(id){ var audio = new Audio('
我是一名优秀的程序员,十分优秀!