「ログ」と「セッション」の 2 つのテーブルがあります。ログには、logID、logName、logDateTime、および sessionID があります。セッションには、sessionID と sessionName があります。
ログはセッションの一部である必要はありませんが、可能です。セッションの一部でない場合、logs.sessionID フィールドは NULL です。セッションの一部である場合、関連する sessionID は logs.sessionID にあり、セッション テーブルと関連付けられます。
目標: これは、titanium studio を使用して開発された私の iPhone アプリケーションの一部です。セッションに複数のログがある場合を除き、各ログが行であるテーブルビューを作成する必要があります。その場合、セッション名を含む行が作成され、セッションの logNames を含むラベルが sessionRow に追加されます。テーブルビューの行は日時順に並べる必要があり、特定のセッションの日時はそのログの最新のものによって計算されます。テーブルビューとして視覚化するには...
12-12-12 logName1
12-11-12 logName2
セッション名
logName3、logName4、logName5
12-10-12 logName6
セッション名2
logName7、logName8、logName9
問題:クエリ/ソートの観点からこれを処理する方法がよくわかりません。私は多くのアイデアを考えましたが、それらはすべて問題を抱えているようです。このテーブルビューの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」を何度もループできますか?ループするたびに最初の行に戻す方法はありますか?
最も重要な質問: 今、私の目標と進行中の作業を説明するために真剣に努力しました。私がまだ気付いていない、これを行うためのはるかに簡単な方法はありますか?