我正在使用Android的ORMLite在我正在寫的一個小應用程序。該應用程序旨在有一個工作的導入/導出功能,我使用簡單的XML框架。而且一切都很好,直到一點。我可以暫時掛起ORMLite中的自動生成的ID嗎?
情況如下:對象A包含引用對象B的外鍵,該對象通過外鍵本身引用對象C.導出數據庫非常好。導入工作,有一個小警告,即只要所有對象的ID都是連續的,並且從1開始,它就會工作。但是,如果數據庫是零散的,即我在這裏和那邊刪除了一條記錄,那麼在導出數據庫之後,我在生成的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,IE
<customer id="2">...</customer>
和
<order id="6">...</order>
<order id="7">...</order>
<order id="8">...</order>
<order id="9">...</order>
等等。當我將數據導入到新的數據庫,我會先通過
保存通過custDao.create((Customer)x);
,然後每一個他們的訂單的客戶對象0
orderDao.create((Order)o);
問題是create函數忽略提供的id(不是0),而新生成的客戶id是1(在新鮮的空數據庫中)。訂單也一樣。但是因爲他們引用id = 2的客戶,他們之間的鏈接就被打破了。
因此,在這個有點冗長的解釋之後,這裏是我的問題:有沒有辦法告訴ORMLite爲generatedId字段提供值並運行它,而不是覆蓋它?如果在創建函數發現已經在表中具有相同ID的行的情況下生成任何異常,但會繼續保存該記錄,否則我會好的... 我想到了解決這個問題的辦法:所有對象應該使用比較器接口通過ID進行排序;將ArrayList與要導入的對象進行排序;對於每個對象 - 將假設的ID讀入一個int, - 使用dao.create保存到數據庫, - 如果對象的新ID與假定ID不同,請通過dao.updateId更改它, - 移至列表中的下一個對象。 。但是這看起來太麻煩,容易出錯:如果create方法試圖生成一個id,而你剛剛使用updateId重新分配給以前的對象,該怎麼辦?
我不相信我的情況非常罕見,以前沒有人遇到過這種情況。我將不勝感激解決方案!
此致 託多爾
只是想確保你看到了我的答案@todor的更新。 – Gray 2011-10-20 17:04:35