2016-03-04 71 views
0

我有一個列表的結構,我想從數據庫中填充。我已經映射了所有表格和插入方法。然而,我不知道什麼是最好的方法來獲取所有這些數據並填充我的Java對象。我有這樣的結構:如何使用SQLite中的子列填充複雜列表?

public class DailySchedule { 
    private long id; 
    private List<Task> tasks; 
    private List<Plan> plans; 
} 

public class Task { 
    private long id; 
    private long duration; 
    private String description; 
    private Date date; 
} 

public class Plan { 
    private long id; 
    private String description; 
    private Date date; 
    private List<User> users; 
} 

public class User { 
    private long id; 
    private String name; 
} 

我應該創建一個巨大的INNERJOIN和獲取所有數據(包括重複的信息),並嘗試填充Java對象,或者我應該從每個表得到所有的ID和執行在Java中循環(使用遊標)並通過ID執行Selects並填充表?

+1

光標將是一個更好的主意,因爲他們創造了非常多的這種確切的情況 - 迭代從數據庫結果查詢 – victorantunes

+0

在這種方法我我要用很多不必要的數據迭代行(InnerJoins的結果)。有更好的方法嗎? – Trinity

回答

1

我假設你有如下表

  • daily_schedule
  • 任務
  • 計劃
  • 用戶

代碼

public List<DailySchedule> getDailySchedules(){ 
    SQLiteDatabase db = getReadableDataBase(); 
    Cursor dailyScheduleCursor = db.rawQuery(「Select * from daily_schedule 」); 
    List<DailySchedule> all = new ArrayList<>(); 
    While(dailyScheduleCursor.next()){ 
     DailySchedule dailySchedule = new DailySchedule(); 
     dailySchedule.setId(dailyScheduleCursor.getLong(0)); 
     dailySchedule.setTasks(getTasks(dailyScheduleCursor.getLong(0))); 
     dailySchedule.setPlans(getTasks(dailyScheduleCursor.getLong(0))); 
     all.add(dailySchedule); 
     } 
    db.close(); 
} 
public List<Task> getTasks(int id){ 
    SQLiteDatabase db = getReadableDataBase(); 
    Cursor taskCursor = db.rawQuery(「Select * from tasks where id =’」+id+」’ 」); 
    List<Task> all = new ArrayList<>(); 
    While(taskCursor.next()){ 
     Task task = new task(); 
     task.setId(taskCursor.getLong(0)); 
     // set other attributes  
     all.add(task); 
    } 
    db.close(); 
    return all; 


} 

public List<Plan> getPlan(int id){ 

    getUser(id);// get all plans 
    // set user 
    return plans; 
} 
public User(int id){ 
     //create user from data 
    return user; 
} 

然後從某處撥打getDailySchedules()

注意:如果你想看到你的SQLite DATABSE內容,請使用 AndroidDBvieweR

+0

非常感謝!我正在考慮實施相同的解決方案,但我不確定它是否是最好的方法。你知道有沒有更好的解決方案? – Trinity