2016-10-02 6 views
1

私は、さまざまなフラグメントやアクティビティを通して多くのユーザー入力を必要とするアプリケーションを持っています。今、私は1つのクラスのすべての変数を「レポート」と呼び、プライマリキーを回して、「レポート」が何であるかを正確に知ることができます(リストビューがあります。変更を加える) 最終的にすべてのユーザー入力がデータベースに書き込まれなければならないので、私は考えていました。つまり、レポートからすべての変数を削除し、静的な最終列名に置き換えて、 gettersとsetterを使用してデータベースとの間で読み書きを行います。これは良いデザインですか、欠けている欠点がありますか? 比較的経験の浅いAndroid開発者として、私は得ることのできるアドバイスを求めています。SQLite DBで直接ゲッターとセッターを使用する

例(申し訳ありませんが、私は携帯電話からこれを書いています間違いがある場合):

public MyTextWatcher extends TextWatcher { 
    private View view; 
    private Report report; 
    public MyTextWatcher(View view, Report report) { 
     this.view = view; 
     this.report = report; 
    } 
    public void afterTextChanged(Editable editable) { 
     String input = editable.toString(); 
     switch(view.getId()) { 
      case R.id.columnA: 
       if (!report.setColumnA(input)) { 
        // something went wrong 
       } 
      ... etc. 
    } 
} 

と活動/フラグメントI中:

public class Report { 
    private int primaryKey; 
    private SQLiteDBHelper db; 

    private static final String ColumnA = "columnA"; 
    private static final String ColumnB = "columnB"; 
    private static final String ColumnC = "columnC"; 
    // lets say columns A and B are Strings and C is an int 

    public Report(int primaryKey, Context ctx) { 
     this.primaryKey = primaryKey; 
     this.db = new SQLiteDBHelper(ctx); 
    } 
    public String getColumnA() { 
     return db.getString(primaryKey, ColumnA) 
    } 
    public boolean setColumnA(String value) { 
     return db.setString(primaryKey, ColumnA, value); 
    } 
    public String getColumnB() { 
     return db.getString(primaryKey, ColumnB) 
    } 
    public boolean setColumnB(String value) { 
     return db.setString(primaryKey, ColumnB, value); 
    } 
    public String getColumnC() { 
     return String.valueOf(db.getInt(primaryKey, ColumnC)); 
    } 
    public boolean setColumnC(String value) { 
     return db.setInt(primaryKey, ColumnC, Helper.tryParseInt(value)); 
    } 
} 

は、私は、このようTextWatcher拡張することができこれを行うとよいでしょう

  • 私はSharedPreferencesに現在の主キー(リストビューから選択された一人のユーザ)を保存し、その後、多くのメモリを使用せずに、私はそれを使用する必要があるすべての活動/フラグメントでそれから新しいレポートを作成することができます

  • 私は確認することができますどのようなユーザーが入力したものをDBにある間に任意のdiscrepency決してありません - 私はすべての活動/フラグメントのためOnTextChangedリスナー

  • に列ごとに、対応するセッターを呼び出すことができ、たとえばEditTextsには、実際に画面に表示されるフィールドのみがデータベースから取得されますinCreate

  • 少ないコードですか? (例えば。私は唯一のget /にsetIntを必要と私のDBヘルパーで/ setStringのメソッドを取得するために、私は一つだけTextWatcherクラスを必要とする、活動/フラグメント間の周りに何かを渡す必要がいけない)

私はこのアプローチを考える理由

  • DBへの常時読み書きとバッテリの使用と速度に問題がある可能性がありますか?

  • ???

+0

個々の列を設定する必要はありません。行全体で値全体を挿入することができます –

+0

はい、データの損失を避けるために、ユーザー入力を即座に保存します。 – HomeIsWhereThePcIs

+0

それは私の問題ではありません...個別にではなく複数の列に一度に 'ContentValues'を挿入することができます –

答えて

1

現在、あなたは以下のとおりです。データベースへのテキストの変更が毎回書く

  • - ユーザーが 各文字を入力するか、文字を削除しているとして、レコードが が保存されているが。これは、ユーザがテキストを保存するために終了するまで待つことさえも残念です。 より良いオプションは、ユーザーが を別のウィジェットに移動するまで待つことです。これは、彼がEditTextの入力を完了したことを意味します。UIスレッド上のデータベースへの書き込み呼び出しの多くを作る

  • を: あなたはこのために( How can i know when a edittext lost focusではより多くの情報を)OnFocusChangeListener使用することができます。
    は、できるだけこれをバックグラウンドに委譲する必要があります。

  • Androidは、ユーザーがアプリと積極的に対話しているときにフォアグラウンドプロセスを強制終了しません。データの消失について心配する必要はありません。必要に応じて、アプリが一時停止するのを待つことができます。

+0

入力直後にhw戻るボタンまたはツールバーの戻るボタンを押したときにonFocusChangedが呼び出されますか?または、ユーザーが入力の直後にアプリを殺すのであれば?アクティビティにコントロールが1つしかなく、フォーカスを失うことがない場合はどうなりますか?または、フラグメントを使用して複数のタブが作成され、ユーザーがスワイプでタブを変更した場合 – HomeIsWhereThePcIs

+0

ナビゲーションは、EditTextをフォーカスを失わせるので、それが呼び出されます。 – ucsunil

+0

多分、私はEditTextを拡張して、列名と型を変数として追加してから、edittext自体にonFocusChangedを上書きすることができます。私はこれを熟考しなければなりません。私はコードを更新します。 私はスレッド化に関する多くの経験がありません。 AsyncTaskはdbコールを処理するのに適していると思いますか? – HomeIsWhereThePcIs

関連する問題