我正在尝试遵循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)的方法,该方法以ProfileString(M)的形式返回要显示的数据。

08-18 08:19
查看更多