我有一个应用程序,它跨各种片段和活动接受大量用户输入。现在,我将所有变量都放在一个类中,我们将其称为“Report”,并传递主键,以确切了解我所处的“Report”是什么。(开始时有一个ListView,用户可以在其中选择要更改的报表)因为所有用户输入最终都必须写入数据库我有一个想法-为什么不从报表中删除所有变量,并用静态最终列名替换它们,只留下主键变量,然后使用getter和setter直接读取和写入数据库?这是一个很好的设计,还是我遗漏了一些缺点?作为一个相对缺乏经验的android开发人员,我希望能得到任何建议。
示例(很抱歉,如果我在电话中写这篇文章时有任何错误):
public class Report {
private int primaryKey;
private SQLiteDBHelper db;
private static final String ColumnA = "columnA";
private static final String ColumnB = "columnB";
private static final String ColumnC = "columnC";
// lets say columns A and B are Strings and C is an int
public Report(int primaryKey, Context ctx) {
this.primaryKey = primaryKey;
this.db = new SQLiteDBHelper(ctx);
}
public String getColumnA() {
return db.getString(primaryKey, ColumnA)
}
public boolean setColumnA(String value) {
return db.setString(primaryKey, ColumnA, value);
}
public String getColumnB() {
return db.getString(primaryKey, ColumnB)
}
public boolean setColumnB(String value) {
return db.setString(primaryKey, ColumnB, value);
}
public String getColumnC() {
return String.valueOf(db.getInt(primaryKey, ColumnC));
}
public boolean setColumnC(String value) {
return db.setInt(primaryKey, ColumnC, Helper.tryParseInt(value));
}
}
然后我可以像这样扩展TextWatcher:
public MyTextWatcher extends TextWatcher {
private View view;
private Report report;
public MyTextWatcher(View view, Report report) {
this.view = view;
this.report = report;
}
public void afterTextChanged(Editable editable) {
String input = editable.toString();
switch(view.getId()) {
case R.id.columnA:
if (!report.setColumnA(input)) {
// something went wrong
}
... etc.
}
}
在活动/片段中,我会这样做
int primaryKey = get from shared pref;
Report report = new Report(primaryKey, getApplication());
EditText columnA = (EditText) v.findViewById(R.id.columnA);
EditText columnB = (EditText) v.findViewById(R.id.columnB);
columnA.setText(report.getColumnA());
columnB.setText(report.getColumnB());
columnA.addTextChangedListener(new MyTextWatcher(columnA, report));
columnB.addTextChangedListener(new MyTextWatcher(columnB, report));
为什么我认为这是个好主意:
>
我可以将当前的主密钥(从ListView中选择的一个用户)保存在SharedPreicks中,然后在我需要使用它的每个活动/片段中从中创建一个新报告,而不会占用太多内存
我可以确保用户输入的内容与数据库中的内容之间没有任何差异,例如在EditText上,我可以为ContextChanged侦听器中的每一列调用相应的setter
对于每个活动/片段,只有实际显示在屏幕上的字段会从onCreate中的数据库中检索
更少的代码?(例如,我只需要DB helper中的get/setInt和get/setString方法,我不需要在活动/片段之间传递任何内容,只需要一个TextWatcher类)
我认为这种方法可能不好的原因:
>
不断读取和写入db-电池使用和速度可能会有问题?
???
目前您是:
>
每次文本更改时写入数据库-当用户键入每个字符或删除字符时,记录将被保存。甚至不等待用户完成保存文本,这就太过分了。更好的选择是等待用户移动到另一个小部件,这意味着他已经完成了对EditText的输入。您可以使用OnFocusChangeListener进行此操作(更多信息请访问:如何知道edittext何时失去焦点)
在UI线程上对数据库进行大量写调用。如果可能,您应该将其委托给后台。
当用户主动与应用程序交互时,Android不会终止前台进程。您不必担心数据丢失。如果需要,您可以等待暂停应用程序。
问题内容: 我熟悉Java,但是刚开始学习JavaFX,尤其是学习JavaFX属性。我了解Oracle的以下示例所示的基本设计模式: 我不明白的是什么时候/为什么要使用getter和setter方法,而不是直接使用Property? 我在想的是,您可能希望在getter和/或setter中有一些自定义代码,这些代码可能对数据做一些前后操作/验证,但是如果您创建自定义getter和/或setter,
SQLiteDB 是基础的 SQLite 的 Swift 封装。SQLiteDB 非常简单,不提供任何高级的函数,不完全是 Swift 编写的,所以跟 Swift 调用 sqlite C API 的方法会有点不同。 SQL 查询示例: let data = db.query("SELECT * FROM customers WHERE name='John'") let row = dat
我正在编写在坐标系上运行的程序,所以我需要经常使用坐标。我决定使用类,因为它显然允许轻松存储点的坐标。 问题是在我的程序中的任何地方,我都将其存储为,而在使用和方法时返回双倍。当然,我可以轻松地将其强制转换为,但它看起来不是很优雅,并且会给代码添加不必要的混乱。 如果我直接得到值,可以吗?这样地: 而不是: 我甚至不确定它是否有任何区别,我只知道getter和setter存在是有原因的,应该使用。
问题内容: 我有两个Java类,一个包含getter和setter,另一个是驱动程序类。我需要来自驱动程序类中扫描程序的用户输入才能属于第一类中的getter。用户输入必须为double,因为它将用作getter中的公式。 问题答案: 真正最好的是将所有内容都放在一个类中,没有理由将一个类分成两个类,只是为了使获取器和设置器与其他类分开,这 没有任何意义 。我确实想知道您是否误解了您的作业。 现在
假设我有一个类Things,它包含许多不同的实例变量。我为它们分别创建了单独的setter和getter方法。如果我想创建另一个存储things'class'的class2,那么为things类中的实例变量创建额外的setter和getter方法是很好的编码方法。另外,假设我有另一个使用class2的class3,那么重复setter和getter方法会产生高耦合吗?
目前,不允许在接口中使用get/set方法(访问器)。例如: 此外,TypeScript 不允许在类方法中使用数组函数表达式:例如: 有没有其他方法可以在接口定义上使用getter和setter?