2017-07-14 5 views
1

は、私は私のAndroidアプリに次のクラスオブジェクトとDBのクラスを持って言うことができます:CursorではなくSQLiteOpenHelper DBクラスからMyClassの初期化されたArrayListを返さない理由はありますか?簡単にするために

public class MyObject{ 
    private String title; 
    private double number; 
}  

public class MyObjectDB extends SQLiteOpenHelper { 
public static final String COL_1 = "ID"; 
     public static final String COL_2 = "TITLE"; 
     public static final String COL_3 = "NUMBER"; 

一般的な例としてはちょうど DBクラスからカーソルオブジェクトを返すために、次を使用して、カーソルがあります..活動等内で使用される小さなデータを設定ため

public Cursor getAllData() { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     return db.rawQuery("select * from "+TABLE_NAME,null); 

    } 

だけ初期化クラスのArrayListの私がを必要とすると仮定すると、DBクラスからオブジェクトを直接 を返すようにしない理由があります空の場合でもリスト?

public ArrayList<MyObject> getMyObjectList(){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor res = db.rawQuery("select * from "+TABLE_NAME,null); 
     ArrayList<MyObject> list = new ArrayList<>(); 

     if(res.getCount()!=0){ 
      res.moveToFirst(); 
      while (!res.isAfterLast()){ 
       MyObject myObj = new MyObject(); 
       myObj.setTitle(res.getString(1)); 
       myObj.setNumber(res.getDouble(2)); 

       list.add(myObj); 
       res.moveToNext(); 
      } 
     } 
     res.close(); 

     return list; 
    } 

私はちょうど例のすべては、常に、リストを初期化するために、呼び出し元の活動の中から使用する必要があるカーソルを返す理由があるかどうかを判断しようとしています。アクティビティ内のコードは、アクティビティ内からまったく同じロジックを実行する必要がなく、必要なリストを返すメソッドを直接呼び出すことができる場合は、よりクリーンです。

これは私が話題に見つけた唯一の多少似て質問した: Object oriented design with database (java): cursors, SQLiteOpenHelper

編集:それカーソルではなく、ArrayListのを返すために、より良いかもしれない理由についての追加の思考 - 私確かに限られてこれについて知っておけば、メモリ内のCursorオブジェクトの寿命は非常によく定義されており、cursor.close()を呼び出すと解放されるようです。対照的に、クラスオブジェクトのリストを初期化して返し、それを呼び出し元クラスのフィールドに直接割り当てると、参照を保持しているので返されたオブジェクトがメモリから解放されないことがあります。私はあなたの意図がそのデータのすべてを表すArrayListを保持することであれば、パフォーマンスの違いをもたらすかどうか、私の質問が残っていると思います。おそらく、新しいArrayListを返すときに、Cursorを返した場合と同じように、最初に宣言したものを直接変更するのではなく、新しいListへの参照を代入しているので、他の注意点があります。 - 私はJavaでこれがどのように動作するかについてほとんど分かっていません(これを求める私の理由)。そこで、ここに間違った情報があればお詫び申し上げます。

答えて

0

サーバーサイドのJavaアプリケーションでは、カーソルではなくリストを提供するDBレイヤーが一般的です。 RAMの制限が非常に強いため、Androidカーソルが体系的に使用されていると思います。

小さなデータセットの場合、リストに変換することはほとんど影響がないため、考慮することができますが、データセットは小さくてもかまいませんか? DB層の外側DBに関連するコードの多くを持っていることの問題については

、多分あなたはCursorAdapterを使用する必要があります(Populate ListView with an arrayList<String> with data obtained from a cursor

関連する問題