【发布时间】:2016-07-13 10:01:03
【问题描述】:
我在声明 JOIN 查询的 provider 包中有一个 ContentProvider:
final String ALL_DATA_FOR_AN_ANIMAL = "SELECT " +
"animals._id, "
+ COLUMN_NAME + " AS _name, "
+ COLUMN_CLASSE + " AS _class, "
+ "IFNULL(" + COLUMN_OVERRIDE_INDIVIDU_NUMBER + ", " + COLUMN_INDIVIDU_NUMBER + ")" + " AS _ind_nb, "
+ "FROM " + ANIMALS_TABLE_NAME + " LEFT JOIN " + ANIMALS_OVERRIDE_TABLE_NAME
+ " ON " + COLUMN_NAME + " = " + COLUMN_OVERRIDE_NAME
+ " WHERE animals._id = ?";
使用 AS 定义的所有 sql 别名都用于 ContentResolver(在 operations 包中)来定义传递给 ContentProvider 中查询的投影和选择
String[] projection = new String[]{"_name", "_class", "_ind_nb", "_in_danger"};
String selection = "_id";
String[] selectionArgs = {selectionArg};
return mCr.query(uri, projection, selection, selectionArgs, sortOrder);
最后在view包中使用别名来显示查询结果
tv_Name.setText(cursor.getString(cursor.getColumnIndex("_name")));
tv_Class.setText(cursor.getString(cursor.getColumnIndex("_class")));
//...
我认为在 Constants 类中定义别名比使用硬编码字符串更好,但我已经在包 ui 中为 ui 声明了一些常量。实用程序。
最佳做法是什么?为整个应用编写一个 Constants 类专业包还是编写一个 Constants 类更好? (.. 或者通过不同的包使用这些别名是不良架构的标志?)
更新
下面是我为gui实现的Constants类,这个类在包view.utils
public class Constants {
public static final int ANIMAL_PAGE_POS = 0;
public static final int CARACTERISTICS_PAGE_POS = 1;
//...
}
我也会对别名做同样的事情,比如:
public class Constants {
public static final String ALIAS_ID = "_id";
public static final String ALIAS_NAME = "_name";
//...
}
问题是:
- 在不同的包之间共享变量(特别是别名)是否是一个好的解决方案?
- (如果第一个问题的答案是肯定的)我是否必须创建多个类似常量的类,或者在单个常量类中为所有包定义所有常量是否是一种好习惯?
【问题讨论】:
-
所以你想使用不可编辑的字符串?
-
如果是,将它们设置为最终。
public static final String ... -
您可以编写一个包含所有列名和方法的 Provider 合同来为您的提供者生成 URI,并使用 this lib 或类似的东西来生成查询
-
cursor.getString(cursor.getColumnIndex("_name"))听起来像cursor.getString("_name")或cursor.getString(XXX_NAME),更安全的选择是record.getName()。 -
这个问题Storing configs in android对你有帮助。