我正在尝试遵循Model-View-Controller的实践来学习应用程序开发。
现在,我在弄清楚如何在与查看/处理相关的数据库中存储内容和类之间取得平衡时遇到了麻烦。
例如,我的应用程序可让您创建配置文件。我有一个SQLite数据库,其中包含表中的所有名称。
但是,这对我来说很有趣。例如,如果要用配置文件名称填充ListView
,则必须创建一个ArrayList<String>
,用数据库中的配置文件名称填充它(通过光标),然后通过ArrayAdapter<String>
进行设置。
也许这一切都很好,但是对我来说却很有趣,因为我不使用类似Profile
类的东西。现在,这样的类仅包含一个private String mProfileName
并且具有一些getter / setters,但是如果我已经具有存储所有内容的数据库,则不需要该类吗?
我对于我的活动类别中是否应该有一个private ArrayList<String> mProfileNames
成员变量感到困惑,还是我应该针对我的活动类别中的一个private ArrayList<Profile> mProfiles
成员变量而感到困惑,或者是否不需要首先,由于所有数据都在数据库中,因此我只需要在函数中实例化arraylist并将其与适配器/ listview-setting等配合使用,就可以将arraylist实例化。
因为如果我确实有一个私有成员变量,除了数据库之外还拥有所有这些名称,那么我就不得不担心要确保在任何时候以任何方式更新数据库(添加/删除/等)时,我也会更新数组列表同样,由于某种原因,这感觉像是一种不好的做法/冒险。
还是我可以使用Profile类而不是我的活动来封装SQL函数?
我确实可以在正确的方向上使用一些指针,以在本示例中正确实现MVC实践。
最佳答案
我有一个SQLite数据库,其中包含表中的所有名称。
因此,您有一个SQLiteOpenHelper
创建一个“配置文件名称”表。Profile
对象可以用于封装数据,但是如果只有一列,则没有必要。
但是,如果要添加更多数据,则每次从表中读取数据时都要对所有cursor.getColumnValue(0...n)
列进行n
并不是一个好习惯。
拥有Profile p = Profile.fromCursor(cursor)
的静态方法可以使它更整洁,然后您可以对String name = p.getName();
的所有实例变量使用Profile
。之后,您将拥有一个完整的对象,可以修改和定义类似profileDBHelper.upsert(p);
的方法来从您的SQLiteOpenHelper
中进行插入或更新。
也许我使用Profile类来封装SQL函数而不是活动?
不是Profile
类,不是。那就是模型。它仅存储数据,不处理数据。您应该实现所有与数据库有关的读写操作,而不是对Activity进行写入SQLiteOpenHelper
实例。其他示例方法可能是boolean contains(String name)
,List<String> getAllNames()
和boolean delete(String name)
。
对于在活动类中是否应该有一个私有的ArrayList<String> mProfileNames
成员变量,或者在活动类中是否应该以一个private ArrayList<Profile> mProfiles
成员变量为目标,我感到困惑。
如果只有一个字符串(数据库中只有一列),那么仅ArrayList<String>
就没有问题。
我必须担心要确保无论何时以任何方式(添加/删除/等)更新数据库,我也以相同的方式更新arraylist
然后仅更新数据库,清除ArrayList,重新查询,然后重新填充列表。不用担心更新ArrayList中的记录。
在此示例中正确实施MVC实践
总体而言,活动应仅在ListView(V)中显示数据。它调用SQLiteOpenHelper
(C)的方法,该方法以Profile
或String
(M)的形式返回要显示的数据。