android - 在 Odoo 移动框架中具有 odoo 功能的 OColumn 不起作用
问题描述
我有这个 OColumn partner_name = new OColumn("Partner", OVarchar.class).setLocalColumn(); 在我的销售订单模型类中,odoo 函数方法依赖于 partner_id 列。我想使用该列 partner_name 在我的列表中搜索 partner_name,但我对如何实现这一点有点困惑。请需要一些帮助。
这是我尝试过的:
基本片段
@Override
public void onViewBind(View view, Cursor cursor, ODataRow row) {
getPartnerIds(row);
OControls.setText(view, R.id.partner_name, row.getString("partner_name")); // displays false
....
}
}
private void getPartnerIds(ODataRow row){
OValues oValues = new OValues();
oValues.put("partner_id", row.get("partner_id"));
saleOrder.storeManyToOne(oValues);
}
更新:
我注意到即使我创建了
@Odoo.Functional(method = "storeManyToOne", store = true, depends = {"partner_id"})
OColumn partner_name = new OColumn("Partner", OVarchar.class).setLocalColumn();
没有创建列。
更新: 具有 odoo 功能的partner_name列
编辑:只需将 'if (type.isAssignableFrom(Odoo.Functional.class)' 放在 'if (type.getDeclaringClass().isAssignableFrom(Odoo.api.class))' 之前以获得正确的值。
解决方案
定义如下partner_name
字段:
@Odoo.Functional(method="storePartnerName", store=true, depends={"partner_id"})
OColumn partner_name = new OColumn("Partner name", OVarchar.class)
.setLocalColumn();
public String storePartnerName(OValues values) {
try {
if (!values.getString("partner_id").equals("false")) {
JSONArray partner_id = new JSONArray(values.getString("partner_id"));
return partner_id.getString(1);
}
} catch (Exception e) {
e.printStackTrace();
}
return "false";
}
您可以简单地partner_name
使用:
row.getString("partner_name")
编辑:
请注意,当您第一次运行应用程序或从应用程序设置中清除数据时,会创建数据库。每次更新数据库列时都需要清理应用程序数据。
如果该列是在数据库创建后添加的,则不会添加到相应的表中。这是因为数据库没有升级。要解决此问题,您可以:
清理应用程序数据以更新您的数据库列
删除用户帐户(这将删除数据库)或重新安装应用程序以重新创建数据库。
或者您可以更改销售订单模型
DATABASE_VERSION
中的odoo/datas/OConstants
then overrideonModelUpgrade
方法并手动升级表(更改销售订单表并使用 SQL 查询添加合作伙伴名称列:)ALTER TABLE sale_order ADD partner_name VARCHAR(100)
。
创建和同步新的销售订单时,应自动计算和存储合作伙伴名称。我注意到在同步后没有为现有记录设置合作伙伴名称,因此我添加了另一个 SQL 查询来计算和设置旧记录的合作伙伴名称的值。
例子:
@Override public void onModelUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("ALTER TABLE sale_order ADD partner_name VARCHAR(100)"); db.execSQL("UPDATE sale_order SET partner_name = (SELECT name from res_partner WHERE _id=partner_id) WHERE partner_name IS NULL AND partner_id IS NOT NULL"); }
编辑(配置):
使用新配置,您将收到以下错误(这将阻止使用注释创建字段):
W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Class.isAssignableFrom(java.lang.Class)' on a null object reference
W/System.err: at com.odoo.core.orm.OModel.compatibleField(OModel.java:349)
代码:
if (type.getDeclaringClass().isAssignableFrom(Odoo.api.class)) {
尝试删除.getDeclaringClass()
编辑:并非所有合作伙伴名称都显示
org.json.JSONException
尝试将partner_id
字符串转换为 JSON 数组时发生错误。
W/System.err: org.json.JSONException: Unterminated array at character 12 of [114.0, UH PARTNER]
当它尝试转换包含空格的名称时会发生错误。为避免这种情况,您可以将partner_id
字符串转换为对象列表。
在partnerName
方法中,替换以下代码:
JSONArray partner_id = new JSONArray(values.getString("partner_id"));
return partner_id.getString(1);
和:
List<Object> partner_id = (ArrayList<Object>) values.get("partner_id");
return partner_id.get(1) + "";
推荐阅读
- drone.io - 如何将 Drone 与自托管 git 存储库一起使用
- jquery - 为什么动画不适用于 IE 中的鼠标滚动但适用于平滑滚动
- selenium - 使用 chrome.tabCapture.capture 时“未找到请求的设备”
- python - IntegerField 上的烧瓶默认值
- angular - 创建 Angular 服务的 NPM 包的正确方法
- kotlin - 为什么在这种情况下不给我一个不可为空的整数
- angularjs - 使用 AngularJS 的 $window 对象是否安全?
- javascript - 如何在 ReactJS 中使用参数正确调用父组件中的事件处理函数?
- highcharts - Highcharts Chrome 71 泄露
- mpi - MPI 进程中的 gtest_output