2017-01-08 3 views
0

SimpleNote、EverNoteなどのアプリケーションは、ユーザーの入力内容を自動的に保存します。私は簡単なアプリケーションで同じことをしようとしています。すべて正常に動作しますが、遅いですが、確かに同じマシンで実行しているアプリケーションよりも遅いです。 (私はC#を使用していますが、私は議論してるすべてのものは、おそらくあまりにも、デルファイに適用されます。)SimpleNoteのようなアプリケーションは、自動的にユーザー入力を更新または保存する方法を教えてください。

私は1つのテーブル(comments)とSQLiteデータベースを持つ2つのテキストフィールド(namefeedback)を有しています。フィールドの1つはリッチテキストボックスからRTFを保持します。自動保存を有効にするには、私は、リッチテキストボックスのTextChangedイベントが発生し、このコードを実行します。

string sql = @"UPDATE comments SET [email protected] WHERE [email protected]"; 
SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); 
command.Parameters.Add(new SQLiteParameter("@name", name)); 
command.Parameters.Add(new SQLiteParameter("@feedback", rtf)); 
command.ExecuteNonQuery(); 

namertfは、メソッドに渡されたパラメータですが、彼らはフィールドの値を保持するデータベース接続が作成され、オブジェクトのコンストラクタで開かれています。 。)

違うイベントが発生したときにこのコードを実行してください。 ...データベース接続を開いたままにして、新しいコマンドを発行するのは間違っていますか?

+0

FWIW、私は、Delphiの実装は、あなたの質問内のコードのようなものを見ないだろう。 Delphiでは、おそらくより適切なイベントを使用します。 – MartynA

答えて

3

ここでの問題は、あまりにも頻繁に保存していることかもしれません。すべてのキーストロークを保存すると、すべてのタイプミスも一時的にデータベースに保存されます。

一般的なパターンは、ユーザーがしばらくアイドル状態になるまで待機することです。 これはそれを行う方法にいくつかの擬似コードです:

Timer _timer; 

public void Handle_TextChanged() 
{ 
    // If timer does not exist, create it 

    // Start or reset the timer to 0 and let if fire in X seconds (3 for example) 
    // This prevents the timer from firing for the next 3 seconds 
} 

public void Timer_Finished() 
{ 
    // When you get here, there hasn't been input for 3 seconds and 
    // you can save to the Database 
} 
+3

このテクニックは一般的にデバウンスと呼ばれます。 – Rob

+0

非常に現実的ではありませんが、ユーザーが休憩をまったく与えない場合は、決して保存しません。 –

+0

@SertacAkyuzどのような状況でユーザーは決して止めませんか?ユーザーが1分以上連続して入力しているとは想像もしません。可能な救済策:閾値(例えば1秒)を下げるか、厳しい制限を設定する:3秒間の非活動化または毎回のxイベント後(100) – Kenneth

関連する問題