I'm getting a list of business as JSON from an API. This list can change so I need to call it periodically to update the data. Each business has an address, but the address doesn't have an id. Because, it's a OneToOne relationship in the server so no need to have a primary key. But on the client side Realm requires and primary key to use copyToRealmOrUpdate(). So I added an id in my Address Class to be able to use it

我从API获得了一个JSON业务列表。此列表可以更改,因此我需要定期调用它来更新数据。每个企业都有一个地址,但地址没有ID。因为,它是服务器中的OneToOne关系,因此无需拥有主键。但在客户端,Realm需要和主键使用copyToRealmOrUpdate()。所以我在我的地址类中添加了一个id才能使用它

Here's my code

这是我的代码

Business class

商务课程

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
}

Address class

地址类

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 example

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
]

Retrieve businesses from api

从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();
    }

The problem is that the address in each business are never saved, and therefore always null when I call them. I can get the address when i make a query like this though:

问题是每个业务中的地址永远不会保存,因此在我调用它们时始终为null。我做这样的查询时可以得到地址但是:

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

But not like this:

但不是这样的:

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

1 个解决方案

#1


0

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

Should be

应该

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

But if you want to optimize this, it could be

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

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);
  }
});

更多相关文章

  1. Android获取WIFI状态下的IP地址以及MAC地址
  2. Android SDK更新以及ADT更新出现问题的解决办法(附google服务器
  3. 域对象/服务和业务逻辑层

随机推荐

  1. 使用Python中的POST将数据发送到PHP
  2. PHP按照 年、月、日创建递归目录
  3. PHP的语言特性-面向对象和C++/java/pytho
  4. 刷新php页面而不重载内容?
  5. 在php中,从字符串中删除逗号后的所有内容
  6. php,检查文本拆分的正确性
  7. 在php中调用父方法的多种方法
  8. centos7 升级php版本
  9. php 正则问题 \s的疑问,求教。。。。
  10. 我如何使用Wikipedia API