1

我正在制作我的第一个 android 应用程序,并且我正在(尝试)使用 db4o 数据库。

一般来说,它的结构是这样的:你有一个“Person”类(有一些继承来区分“boss”、“employee”、“intern”……但我猜这并不重要)。
你也有“任务”类。'Task' 对象具有(以及其他属性)带有 Persons 的 ArrayList。任务可以在没有人员分配的情况下存在,反之亦然。

我遇到的问题是 db4o 似乎没有跟踪我的对象。因此,当我尝试将一个人(通过查询从数据库加载)附加到一个任务时,这个人会被复制。所以现在我已经通过对 Person 对象执行 QBE 并将返回的对象添加到 Task 来解决这个问题。但这似乎很不对劲?

所以某处对我的对象的引用丢失了......我一直保持数据库连接打开(仅在 onDestroy 上关闭它)。

这是一个示例操作:我有一个活动,我在其中填写任务的一些属性,然后使用 ActivityForResult 从 ListView 中选择(并返回)Person-object(通过意图)。然后回到我想链接并保存它们的第一个活动。

我在意图中传递的对象是可序列化的,而不是可打包的,我不知道除了“性能影响”之外这是否重要?

我愿意发布一些代码,但我不知道代码的哪一部分有助于识别问题?

我认为相关的代码:

添加任务活动:

(这是在 onCreate 中)

Db4oHelper db4oHelper = new Db4oHelper(context);
db=db4oHelper.db();

(...)

Button AddButton = (Button) findViewById(R.id.Addbutton);
AddButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        Intent pickUserIntent = new Intent(context,PickUser.class);
        startActivityForResult(pickUserIntent,1);
    }
});

和:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
    if (resultCode == RESULT_OK) {
        ArrayList<Person> personList_local = (ArrayList<Person>)
            data.getSerializableExtra("PERSONS");
    ArrayList<Person> personList_db=new ArrayList<Person>();
    for (Person p:personList_local){
        personList_db.add((Person)helper.listResultToArray(db.queryByExample(po)).get(0));
    }
    Task t = new Task("Description",personList_db);
    db.store(t);
        db.commit();
    }
}

具有 listResultToArray 的帮助器类只是一个简单的迭代 for 循环,它将由数据库返回的 ObjectSet 的项目放入列表视图所需的 ArrayList 中。

PickUser 活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    persons_sel=new ArrayList<Person>();
    Db4oHelper db4oHelper = new Db4oHelper(context);
    db=db4oHelper.db();
    persons_all=helper.listResultToArray(db.query(Person.class));

    list = (ListView) findViewById(android.R.id.list);

    this.adapter = new PersonAdapter(this, R.layout.row_checkbox, persons_all);
    setListAdapter(this.adapter);

    list.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {


            Person p = (Person) parent.getItemAtPosition(position);
            CheckBox check = (CheckBox) view.findViewById(R.id.check);
            if (!person_sel.remove(p)) { 
                person_sel.add(p);
                check.setChecked(true);
            }else{
                check.setChecked(false);
            }
        }
    });
    Button SubmitButton = (Button) findViewById(R.id.SubmitButton);
    SubmitButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            if (persons_sel.size()>0){
             Intent returnIntent = new Intent();
             returnIntent.putExtra("PERSONS", persons_sel); 
             setResult(RESULT_OK,returnIntent); 
             finish();
            }else{
                Toast.makeText(getApplicationContext(),
                          "You must select at least something!", 
                          Toast.LENGTH_SHORT).show();
            }
        }
    });
}

private class PersonAdapter extends ArrayAdapter<Person> {

    private ArrayList<Person> items;

    public PersonAdapter(Context context, int textViewResourceId,
            ArrayList<Person> items) {
        super(context, textViewResourceId, items);
        this.items = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row_checkbox, null);
        }
        Person p = items.get(position);
        if (p != null) {
            TextView tt = (TextView) v.findViewById(R.id.toptext);
            if (tt != null) {
                tt.setText(p.toString());
            }
        }
        return v;
    }
}
4

0 回答 0