2016-04-24 157 views
1

我試圖使用GreenDAO爲to-many relation between Users and Articles建模,其中一個User has many Articles默認情況下,GreenDao外鍵設置爲空ToMany關係

參考:GreenDAO Documentation on Relations

我GreenDAO的生成代碼如下:

Schema schema = new Schema(1, "com.example.greendao.models"); 
schema.enableKeepSectionsByDefault(); 
schema.setDefaultJavaPackageDao("com.example.greendao.dao"); 

Entity user = schema.addEntity("User"); 
user.addIdProperty().primaryKey(); 
user.addStringProperty("name"); 

Entity article = schema.addEntity("Article"); 
article.addIdProperty().primaryKey().autoincrement(); 
article.addStringProperty("title"); 
article.addStringProperty("content"); 
Property userId = article.addLongProperty("userId").notNull().getProperty(); 

ToMany userToArticles = user.addToMany(article, userId); 
userToArticles.setName("articles"); 

new DaoGenerator().generateAll(schema, "app/src/main/java"); 

接下來,我通過RetrofitUsersArticles和使用GSON


將其轉換爲List<User> Sampl ËHTTP API響應

[ 
    { 
    "id": 1, 
    "name": "Example Name 1", 
    "articles": [ 
     { 
     "id": 2, 
     "title": "Example Title 2", 
     "content": "Example Content 2" 
     }, 
     { 
     "id": 10, 
     "title": "Example Title 10", 
     "content": "Example Content 10" 
     } 
    ] 
    }, 
    { 
    "id": 2, 
    "name": "Example Name 2", 
    "articles": [ 
     { 
     "id": 111, 
     "title": "Example Title 111", 
     "content": "Example Content 111" 
     } 
    ] 
    } 
] 

轉換後,我得到一個List<User>對象,其中第一用戶的狀態是:

  • ID:1
  • 名稱:實例名稱1
  • 文章:
    • 第一篇文章
    • id:2
    • 標題:實施例名稱2
    • 含量:實施例內容2
    • 用戶名:空

      第二製品
    • ID:2
    • 標題:實施例名稱2
    • 含量:實施例內容2
    • userId:null


,這裏是我如何將我的用戶和文章

daoSession.runInTx(new Runnable() { 
    @Override 
    public void run() { 
     for (User user : users) { 
      userDao.insertOrReplaceInTx(user); 
      articleDao.insertOrReplaceInTx(user.articles()); 
     } 
    } 
}); 


問題:

當用戶獲取使用UserDao,和文章檢索使用getArticles()方法,正確的文章檢索,但第字段爲空(這是有道理的,因爲用戶id爲空的話)

有沒有一種方式,當在ArticlesDAO物品插入,userId值可以自動設置爲用戶的ID,而不是手動設置它每次在代碼中的userId?

注意外鍵約束已設置已經

回答

1

你應該做這樣的事情:

daoSession.runInTx(new Runnable() { 
    @Override 
    public void run() { 
     for (User user : users) { 
      userDao.insertOrReplaceInTx(user); 
      for (Article article : user.getArticles()) { 
       article.setUser(user); 
       articleDao.insertOrReplaceInTx(article); 
      } 
     } 
    } 
}); 

我知道這可能是更漂亮,但是,據我所知,你要設置用戶的每個實體一個接一個。

相關問題