2016-12-13 145 views
0

我从API获取JSON业务列表。这个列表可以改变,所以我需要定期调用它来更新数据。 每个公司都有一个地址,但该地址没有ID。因为,这是一个OneToOne关系在服务器中,所以不需要有主键。但是在Realm客户端需要使用主键copyToRealmOrUpdate()。所以,我在地址类加入ID能够使用它领域:更新外部对象的ID

这里是我的代码

公务舱

public class Business extends RealmObject{ 

@PrimaryKey 
private int id; 
private Category category; 
private String name; 
private String description; 


private String telephone; 
private String fax; 
private String email; 
private String website; 
private Address address; 

//getters and setters 
} 

地址类

public class Address extends RealmObject{ 


@PrimaryKey 
private int id ; 
@SerializedName("street_type") 
private String streetType; 
@SerializedName("street_number") 
private String streetNumber; 
@SerializedName("street_name") 
private String streetName; 
private String direction; 
private String city; 
private String province; 
@SerializedName("postal_code") 
private String postalCode; 

public Address(){ } 

public void setAddress(Address a){ 
    this.streetName = a.getStreetName(); 
    this.streetType = a.getStreetType(); 
    this.direction = a.getDirection(); 
    this.city = a.getCity(); 
    this.province = a.getProvince(); 
    this.streetNumber = a.getStreetNumber(); 
    this.postalCode = a.getPostalCode(); 
} 
//other getters and setters 
} 

JSON例如

[ 
{ 
    "id": 2, 
    "address": { 
     "business": 2, 
     "street_number": 1111, 
     "street_type": "ST", 
     "street_name": " STREET NAME", 
     "direction": "", 
     "city": "CITY", 
     "province": "QC", 
     "postal_code": "H0H 0H0" 
    }, 
    "category": { 
     "id": 1, 
     "name": "Restaurant", 
     "active": true 
    }, 
    "name": "Business", 
    "description": "a description", 
    "email": "", 
    "person_in_charge": "", 
    "website": "", 
    "telephone": "(514) 555-5555", 
    "fax": "", 
}, 
//others business 
] 

从API

Realm realm = Realm.getDefaultInstance(); 
     List<Business> businesses = null; 
     try { 
      businesses = new CallGenerator<List<Business>, BusinessService>().asynAPICall(
        new CallGenerator.AsynAPICallback<BusinessService>() { 
         @Override 
         public Call onApiCall(BusinessService client) { 
          return client.getBusinessesByCategory(null); 
         } 
        }, BusinessService.class).execute().get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 


     for (Business b : businesses) { 
      Address realmAddress = realm.where(Address.class).equalTo("id", b.getId()).findFirst(); 

      realm.beginTransaction(); 

      if (realmAddress == null) 
       realmAddress = realm.createObject(Address.class, b.getId()); 
      realmAddress.setAddress(b.getAddress()); 
      b.setAddress(realmAddress); 
      realm.copyToRealmOrUpdate(b); 
      realm.commitTransaction(); 
    } 

的问题是,在每笔业务的地址永远不会保存,因此,当我打电话给他们总是空检索业务。我能得到的地址时,我作出这样虽然查询:

Address a = realm.where(Address.class).equalTo("id",business.id).findFirst(); 

但不喜欢这样:

Business mBusiness = realm.where(Business.class).equalTo("id", id).findFirst(); 
mBusiness.getAddress//always null 

回答

0
 Address realmAddress = realm.createObject(Address.class,b.getId()); 

应该

 Address realmAddress = realm.where(Address.class).equalTo("id", b.getId()).findFirst(); 
     if(realmAddress == null) { 
      realm.createObject(Address.class,b.getId()); 
     } 

但是,如果你想优化这个,它可能是

realm.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
    Address realmAddress = new Address(); 
    for (Business b : businesses) { 
     realmAddress.setId(b.getId()) 
     realmAddress.setStreetName(b.getAddress().getStreetName()); 
     realmAddress.setStreetType(b.getAddress().getStreetType()); 
     realmAddress.setDirection(b.getAddress().getDirection()); 
     realmAddress.setCity(b.getAddress().getCity()); 
     realmAddress.setProvince(b.getAddress().getProvince()); 
     realmAddress.setStreetNumber(b.getAddress().getStreetNumber()); 

     realm.insertOrUpdate(realmAddress); 
     Log.i(TAG,"New address id "+realmAddress.getId() +" with address "+ realmAddress); 
    } 
    List<Business> realmRepos = realm.copyToRealmOrUpdate(businesses); 
    } 
}); 
+0

它的工作,以防止“RealmPrimaryKeyConstraintException错误”,但我仍然无法恢复地址 – user7286534