我有两个表,“日志”和“会话”。日志具有 logID、logName、logDateTime 和 sessionID。一个会话有一个 sessionID 和 sessionName。
日志不需要是会话的一部分,但它可以是。如果它不是会话的一部分,则字段 logs.sessionID 为 NULL。如果它是会话的一部分,则关联的 sessionID 位于 logs.sessionID 中,并且与会话表相关。
目标: 这是我使用钛工作室开发的 iphone 应用程序的一部分。我需要创建一个表视图,其中每个日志都是一行,除非会话中有多个日志。在这种情况下,将创建带有会话名称的行,并将带有会话 logNames 的标签添加到 sessionRow。tableview 行需要按日期时间排序,给定会话的日期时间由最近的日志计算。因此,将其可视化为表格视图...
12-12-12 日志名称 1
12-11-12 日志名称2
会话名称
日志名称 3、日志名称 4、日志名称 5
12-10-12 日志名称6
会话名称2
日志名称 7、日志名称 8、日志名称 9
问题:我不太确定如何从查询/排序的角度处理这个问题。我想过很多想法,但它们似乎都有问题。我不是在寻求有关构建此 tableview 的 UI 的帮助,而只是一种处理数据的解决方案。
进行中的工作:
**OPTION 1:**
var rowArray=[];
var ignoreArray=[];
var rows = select logID, logName, logDateTime, logs.sessionID, sessionName
FROM logs, sessions WHERE logs.sessionID=sessions.sessionID OR
logs.sessionID IS NULL ORDER BY logDateTime DESC, logs.sessionID;
while(rows.isValidRow()){
var logSessionID = rows.fieldByName('sessionID');
if(logSessionID){//if the current log is part of a session
//1. check ignoreArray to see if this session has
already been created. If not, continue steps 2-4.
//2. create a tableview row with the sessionName
//3. loop through all rows, and add the logName to the row created above
ONLY when it contains the current sessionID
//4. add session row to rowArray
//5. put current sessionID into ignoreArray, so that there won't be
duplicate session rows.
}else{
//1. create a regular log row, as it is not part of a session
//2. add log row to rowArray
}
rows.next();
}
//everything is complete, set the array of data to the tableview
tableview.setData(rowArray);
我对选项 1 的疑虑/问题:
由于每次我打开一个新会话时都会遍历所有行,因此效率是否非常低
如果不是数千个日志,它会很慢吗?
当我正在循环遍历所有行(嵌套)时,如何循环遍历所有行?
选项 2:
var presortArray=[]; var logs = select * from logs WHERE sessionID IS NULL; var sessionlogs = select * from logs WHERE sessionID IS NOT NULL; var sessions = select * from sessions; while(logs.isValidRow()){ //1. create log row, push to presortArray; }; while(sessions.isValidRow()){ //1. create session row //2. loop through sessionlogs, adding each to the session row that contains the current sessionID. Make sure the session Row gets a custom date field for future array sorting //3. push session row to presortArray }; //all rows are now in presortArray. var sortArray = //find a way to sort the rows in presortArray based on datetime tableview.setData(sortArray);
我对选项 2 的疑虑/问题:
基于数组中每个对象的自定义字段使用某种形式的数组排序会很慢吗?
我可以多次循环“sessionLogs”吗,有没有办法在每次循环时将其设置回第一行?
最重要的问题:现在我已经认真努力地解释,希望不要过度解释,我的目标和我正在进行的工作。有没有更简单的方法可以做到这一点,我还没有意识到?