【问题标题】:How to update SQLite database in fragment? Android如何在片段中更新 SQLite 数据库?安卓
【发布时间】:2014-12-29 22:18:55
【问题描述】:

我在片段的列表视图中显示我的数据库。我还在对话框中添加了一个新数据。 当我在对话框中添加一些数据时,我在更新数据库时遇到了一点问题,当我返回在列表视图中显示我的数据库的片段时,我最近没有添加任何数据。当我关闭并重新打开我的应用程序时,数据会显示在列表视图中。

我想你明白我的问题了。

这是我的代码。

这是我的 MainActivity,它有一个按钮和一个片段。

public class MainActivity extends FragmentActivity implements
    ActionBar.TabListener {

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ImageButton addBirthdate;

private DB database = new DB(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initilization
    viewPager = (ViewPager) findViewById(R.id.pager);
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);

    addBirthdate = (ImageButton)findViewById(R.id.buttonAddBirthday);
    addBirthdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AddBirthdayDialog dialog = new AddBirthdayDialog(MainActivity.this);
            dialog.show();
        }
    });

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {

}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {

}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {

}


}

这是我在列表视图中显示我的数据库的片段。

public class JanuaryFragment extends Fragment {

private DB myDB;
private List<Person> people;
private ListView listView;
private Context mContext;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.january_fragment, container, false);

    mContext = getActivity();

    myDB = new DB(mContext);
    people = getThisMonthsPeople( myDB.getAllPeople());

    listView = (ListView)rootView.findViewById(R.id.listViewOfBirthdays);
    listView.setAdapter(new PersonAdapter(mContext, people));

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            EditBirthdayDialog dialog = new EditBirthdayDialog(mContext, people.get(position));
            dialog.show();
        }
    });

    return rootView;
}

public List<Person> getThisMonthsPeople(List<Person> allPeople){
    List<Person> resultPeople = new LinkedList<Person>();
    for(int i = 0; i< allPeople.size(); i++){
        if(allPeople.get(i).getMonth()==1){
            resultPeople.add(allPeople.get(i));
        }
    }
    return resultPeople;
}
}

这是我添加新数据的对话框。

public class AddBirthdayDialog extends Dialog {

private Context context;
String name;
String sname;
private int day;
private int month;
private int year;

final EditText textName;
final EditText textSname;
final DatePicker birthDate;

private DB myDB;
private SQLiteDatabase database;
private Person person = new Person();

public AddBirthdayDialog(Context context) {
    super(context);
    this.context = context;

    setCanceledOnTouchOutside(false);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.addbirthday_layout);


    myDB = new DB(context);


    textName = (EditText) findViewById(R.id.editTextname);
    textSname = (EditText) findViewById(R.id.editTextsname);
    birthDate = (DatePicker) findViewById(R.id.datePicker);



    Button cancelButton = (Button) findViewById(R.id.cancelbutton);
    cancelButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            clearForm();
            dismiss();

        }
    });

    Button save = (Button) findViewById(R.id.buttonadd);
    save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            name = textName.getText().toString();
            sname = textSname.getText().toString();

            day = birthDate.getDayOfMonth();
            month = birthDate.getMonth()+1;
            year = birthDate.getYear();
            final String dayStr = String.valueOf(day);
            final String monthStr = String.valueOf(month+1);
            final String yearStr = String.valueOf(year);

            person.setName(name);
            person.setSname(sname);
            person.setDay(day);
            person.setMonth(month);
            person.setYear(year);
            person.setDateStr(dayStr + "/" + monthStr + "/" + yearStr);

            myDB.addBirthday(person);
            clearForm();
            dismiss();
        }
    });
}

public void setDatePicker(int day, int month, int year){
    birthDate.updateDate(day,month,year);
}

//Cleans the form
public void clearForm(){
    textName.setText("");
    textSname.setText("");
    textSname.setText("");
}
}

这是我可以在列表视图中编辑数据的对话框。

public class EditBirthdayDialog extends Dialog {

private Context context;
String name;
String sname;
private int day;
private int month;
private int year;

final EditText textName;
final EditText textSname;
final DatePicker birthDate;

private DB myDB;
private SQLiteDatabase database;
private Person person;

public EditBirthdayDialog(Context context, final Person person) {
    super(context);
    this.context = context;
    this.person = person;

    setCanceledOnTouchOutside(false);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.editbirthday_layout);


    myDB = new DB(context);


    textName = (EditText) findViewById(R.id.editTextname);
    textName.setText(person.getName());
    textSname = (EditText) findViewById(R.id.editTextsname);
    textSname.setText(person.getSname());
    birthDate = (DatePicker) findViewById(R.id.datePicker);
    birthDate.updateDate(person.getYear(),person.getMonth()-1,person.getDay());

    Button cancelButton = (Button) findViewById(R.id.cancelbutton);
    cancelButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            clearForm();
            dismiss();

        }
    });

    Button save = (Button) findViewById(R.id.buttonadd);
    save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            name = textName.getText().toString();
            sname = textSname.getText().toString();

            day = birthDate.getDayOfMonth();
            month = birthDate.getMonth()+1;
            year = birthDate.getYear();
            final String dayStr = String.valueOf(day);
            final String monthStr = String.valueOf(month);
            final String yearStr = String.valueOf(year);

            person.setName(name);
            person.setSname(sname);
            person.setDay(day);
            person.setMonth(month);
            person.setYear(year);
            person.setDateStr(dayStr + "/" + monthStr + "/" + yearStr);

            myDB.updateBirthday(person);
            clearForm();
            dismiss();
        }
    });

    Button buttonDelete = (Button) findViewById(R.id.buttondelete);
    buttonDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            myDB.deleteBirthday(person);
            clearForm();
            dismiss();
        }
    });
}

public void setDatePicker(int day, int month, int year){
    birthDate.updateDate(day,month,year);
}

//Cleans the form
public void clearForm(){
    textName.setText("");
    textSname.setText("");
}
}

已编辑。

提前谢谢你!

【问题讨论】:

  • 对话框关闭时重新加载数据。您只是在数据库中添加数据,而不是刷新列表视图。
  • @Rohit5k2 但是我怎样才能重新加载:) 你能告诉我路吗?
  • 请看我的回答。

标签: android sqlite android-fragments


【解决方案1】:

对话框关闭时重新加载数据。您只是在数据库中添加数据,而不是刷新列表视图。

在你的片段中添加这个方法

public void reload()
{
    myDB = new DB(mContext);
    people = getThisMonthsPeople( myDB.getAllPeople());
    myAdapter = new PersonAdapter(mContext, people)
    listView.setAdapter(myAdapter);
    if(myAdapter != null)
        myAdapter.notifyDataSetChanged();
}

onCreateView()中删除这三行

myDB = new DB(mContext);
people = getThisMonthsPeople( myDB.getAllPeople());
listView.setAdapter(new PersonAdapter(mContext, people));

在你的活动中

@Override
public void onResume()
{
    super.onResume();
    JanuaryFragment fragment = (JanuaryFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.layout); // Replace "layout" with your layout where you are loading the fragment
    if (fragment != null) {
        fragment.reload();
    }
}

编辑:

在调用dismiss()之前单击保存按钮时将其添加到AddBirthdayDialog

if(context instanceOf MainActivity)
    ((MainActivity)context).onResume();

注意:

我建议您将接口用于这些行为。如果您想使用接口获得更好的解决方案,请参阅我的答案。 Communicating my Dialog with Main Activity

【讨论】:

  • 请立即尝试。对onResume 方法做了一个小改动。
  • 这也没用。如果您需要整个代码,我可以为您发布
  • 您正在使用EditBirthdayDialog,但已发布AddBirthdayDialog 的代码。你能改正吗?
  • EditBirthdayDialog 是另一个对话框,当我单击 listView 时可以编辑数据。
  • 你能把代码贴在你调用添加对话框的地方吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多