Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有理由不从SQLiteOpenHelper DB类返回MyClass的初始化ArrayList而不是游标?_Java_Android_Performance_Cursor_Sqliteopenhelper - Fatal编程技术网

Java 是否有理由不从SQLiteOpenHelper DB类返回MyClass的初始化ArrayList而不是游标?

Java 是否有理由不从SQLiteOpenHelper DB类返回MyClass的初始化ArrayList而不是游标?,java,android,performance,cursor,sqliteopenhelper,Java,Android,Performance,Cursor,Sqliteopenhelper,为简单起见,假设我在Android应用程序中有以下class对象和DB类: 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

为简单起见,假设我在Android应用程序中有以下class对象和DB类:

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);

    }
对于小数据集是否有理由不只是初始化并返回 直接来自DB类的类对象的ArrayList,假设我需要 即使是空的列表

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;
    }
public ArrayList getMyObjectList(){
SQLiteDatabase db=this.getWritableDatabase();
Cursor res=db.rawQuery(“select*from”+表名称,null);
ArrayList=新建ArrayList();
如果(res.getCount()!=0){
res.moveToFirst();
而(!res.isAfterLast()){
MyObject myObj=新的MyObject();
myObj.setTitle(res.getString(1));
myObj.setNumber(res.getDouble(2));
添加列表(myObj);
res.moveToNext();
}
}
res.close();
退货清单;
}
我只是想确定所有示例总是返回一个游标是否有原因,然后必须从调用活动中使用该游标来初始化列表。如果活动可以直接调用一个方法来返回它所需的列表,而不必从活动中执行完全相同的逻辑,那么活动中的代码就更干净了

这是我在这个话题上发现的唯一一个类似的问题:


编辑:关于为什么返回游标比返回ArrayList更好的另一个想法——在我公认的有限知识中,似乎游标对象在内存中的生存期定义得非常好,并且在调用Cursor.close()时被释放。相反,如果初始化并返回类对象列表,然后直接将其分配给调用类中的字段,则返回的对象可能不会从内存中释放,因为您持有引用。我想我的问题仍然是,如果您的意图是持有一个表示所有这些数据的ArrayList,那么它是否会影响性能。可能还有其他的注意事项需要说明,因为在返回新的ArrayList时,您将引用分配给一个新列表,而不是直接修改您最初声明的列表,就像您返回游标一样--无可否认,我对Java中的工作原理知之甚少(我提出这个问题的原因),因此,如果这里有任何错误信息,我深表歉意。

在服务器端Java应用程序中,提供列表而不是游标的DB层是很常见的。我认为Android游标被系统地使用,因为RAM的限制非常强

对于较小的数据集,转换为列表的影响很小,因此可以考虑,但您确定数据集将很小并且保持不变吗


对于在DB层之外有大量与DB相关的代码的问题,也许您应该在服务器端Java应用程序中使用CursorAdapter()

,通常使用提供列表而不是游标的DB层。我认为Android游标被系统地使用,因为RAM的限制非常强

对于较小的数据集,转换为列表的影响很小,因此可以考虑,但您确定数据集将很小并且保持不变吗

对于在DB层之外有大量与DB相关的代码的问题,也许您应该使用CursorAdapter()