2017-07-14 70 views
1

为了简单起见,可以说,我在我的Android应用程序下面的类对象和DB类:是否有原因不从SQLiteOpenHelper DB类而不是从Cursor返回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; 
    } 

我只是想确定是否有一个原因,所有的例子总是返回游标,然后必须从调用活动中使用初始化列表。如果Activity可以直接调用一个方法来返回它所需的列表,那么Activity中的代码会更清晰,而不必在Activity中执行完全相同的逻辑。

这是唯一有点类似的问题,我的话题发现: Object oriented design with database (java): cursors, SQLiteOpenHelper

编辑:为什么它可能更好地返回游标,而不是ArrayList的另外一个想法 - 在我固然有限了解这一点,似乎内存中Cursor对象的生命周期非常明确,并在调用cursor.close()时释放。相比之下,如果初始化并返回一个类对象列表,然后直接将其分配给调用类中的某个字段,那么返回的对象可能不会从内存中释放,因为您持有该引用。我想我的问题仍然存在,如果你的意图是持有表示所有数据的ArrayList,那么它是否会导致性能差异。也许还有其他的注意事项,因为当你返回新的ArrayList时,你将分配一个对新List的引用,而不是直接修改你最初声明的那个,就像你返回一个Cursor一样。 - 我承认对Java的这种工作方式知之甚少(我的理由是这么说),所以如果在这里有任何不正确的信息,我很抱歉。

回答

0

在服务器端Java应用程序中,通常有一个提供列表而不是游标的数据库层。我认为系统地使用Android游标是因为RAM限制非常强大。

对于小数据集,转换为列表几乎没有什么影响,因此可以考虑,但是您确定数据集会很小并且仍然如此吗?

对于在DB层外面有很多与DB有关的代码的问题,也许你应该使用CursorAdapter(Populate ListView with an arrayList<String> with data obtained from a cursor

相关问题