背景:
我已经在数据库中创建了一个Orders表,并分别通过两个活动CurrentOrders
和NewOrders
来操纵它。
CurrentOrders
活动显示了TableLayout
中存储在数据库中的当前订单。为了向表中添加新订单,我指定了一个按钮addOrders
,单击该按钮将加载NewOrders
活动。
CurrentOrders:
public class CurrentOrders extends AppCompatActivity {
private TableLayout table;
populateTable(Cursor records){
TableRow row = new TableRow(this);
TextView product = new TextView(this);
TextView price = new TextView(this);
product.setText(records.getString(1));
price.setText(records.getString(2));
row.addView(product);
row.addView(price);
table.addView(row);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_current_orders);
Cursor cursor = db.query("orders", null, null,
null, null, null, null);
table = findViewById(R.id.tab);
while(cursor.moveToNext())
populateTable(cursor);
}
public void addOrders(View view){
startActivity(new Intent(getApplicationContext(), NewOrders.class));
}
}
NewOrders
活动的作用类似于表单,它具有一个TableLayout
,其单元格/字段指定为EditText
,以便用户键入要存储的订单。为了将订单保存在数据库中,我指定了一个提交按钮,单击该按钮可将EditText
的值存储在数据库的Orders表中,然后返回到父活动(CurrentOrders
)以显示所有数据库中的订单。
新订单:
public class NewOrders extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_orders);
}
public void submit(View view){
TableLayout table = findViewById(R.id.newOrders);
int count = table.getChildCount();
for (int idx = 0; idx < count; idx++){
TableRow row = (TableRow) table.getChildAt(idx);
EditText product = (EditText) row.getChildAt(1);
EditText price = (EditText) row.getChildAt(2);
String productVal = product.getText().toString();
double priceVal = Double.parseDouble(price.getText().toString());
long result = db.insert(productVal, priceVal);
}
Toast.makeText(this, "Saved.", Toast.LENGTH_SHORT).show();
onBackPressed();
}
}
问题:
除非重新加载CurrentOrders
活动,否则我看不到插入新记录。我想显示所有记录(包括新记录),而不必重新加载活动。
答案 0 :(得分:0)
最后创建了一个简单的解决方案:
首先,我们需要修改startActivity
中的CurrentOrder
,以使其从NewOrders
活动中接收数据:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
// add newly added orders
if (data != null) {
String response = data.getStringExtra("newOrders");
if (requestCode == RequestCode && resultCode == RESULT_OK && !response.isEmpty()){
String[] orders = response.trim().split(" ");
for (String order : orders) {
// get new orders from the database
Cursor records = db.query("orders", null, "id = ?",
new String[] {String.valueOf(id)},
null, null, null);
records.moveToNext();
populateTable(records);
}
}
}
}
然后在addOrders
方法中,您需要用以下代码替换startActivity
:
startActivityForResult(new Intent(getApplicationContext(), NewOrders.class), 2);
现在开始进行NewOrders
活动,我创建了一个字符串变量,用于存储新创建的订单的ID:
public class NewOrders extends AppCompatActivity {
// created a string variable
private String newOrdersId = "";
// reset of the code
public void submit(View view){
// rest of the code
for (int idx = 0; idx < count; idx++){
// rest of the code
// record id's of orders inserted into the database
newOrderId += result + " ";
}
// reset of the code
}
}
最后,您需要通过重写CurrentOrders
这样的方法将数据发送到onBackPressed
:
@Override
public void onBackPressed(){
Intent intent = getIntent();
intent.putExtra("newOrders", newOrdersId);
setResult(RESULT_OK, intent);
finish();
}