我正在制作我的第一个 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;
}
}