我正在研究一個Android應用程序,該應用程序在從服務器獲取數據後顯示學生的成績。退出時,應用會將數據保存在本地數據庫中,以便在下次啓動時重新加載數據。要存儲我創建了兩個表的數據,學生和課程。學生課程表有一對多的關係應用程序不顯示從Android數據庫加載的數據
我創建了一個自定義的AsyncTaskLoader來加載數據。兩個類擴展了這個自定義加載器,一個叫做StudentLoader,它從學生表中加載學生數據,另一個叫CourseLoader,它從課程表中爲特定學生加載課程(在課程表中有一個學生ID外鍵)。
下面是自定義的加載類
//Student Loader Class
public class StudentLoader extends DataLoader<Student> {
private String mSid;
private StudentDbAdapter dbAdapter;
public StudentLoader(Context context, String sid) {
super(context);
mSid = sid;
dbAdapter = new StudentDbAdapter(context);
}
@Override
public Student loadInBackground() {
return dbAdapter.queryStudent(mSid);
}
}
//Course Loader class
public class CoursesLoader extends DataLoader<ArrayList<Course>> {
private long mId;
private StudentDbAdapter dbAdapter;
public CoursesLoader(Context context, long id)
{
super(context);
mId = id;
dbAdapter = new StudentDbAdapter(context);
}
@Override
public ArrayList<Course> loadInBackground() {
return dbAdapter.getCourses(mId);
}
}
在啓動時,我用了兩個LoaderCallback類異步(並分別)加載兩個學生和課程數據和更新基於返回的結果的UI。我將LoaderCallback類放入顯示學生成績的片段中。
這裏有LoaderCallback類
private class StudentLoaderCallbacks implements LoaderManager.LoaderCallbacks<Student>{
@Override
public Loader<Student> onCreateLoader(int i, Bundle bundle) {
return new StudentLoader(getActivity(), mId);
}
@Override
public void onLoadFinished(Loader<Student> loader, Student student) {
mStudent = student;
Log.d(TAG, "Finished Loading data...");
updateUI(mStudent);
}
@Override
public void onLoaderReset(Loader<Student> loader) {
}
}
private class CoursesLoaderCallbacks implements LoaderManager.LoaderCallbacks<ArrayList<Course>>
{
@Override
public Loader<ArrayList<Course>> onCreateLoader(int i, Bundle bundle) {
return new CoursesLoader(getActivity(), _id);
}
@Override
public void onLoadFinished(Loader<ArrayList<Course>> loader, ArrayList<Course> courses) {
mStudent.setCourses(courses);
}
@Override
public void onLoaderReset(Loader<ArrayList<Course>> loader) {
}
}
應用程序加載,但不顯示視圖,只提出一個空白屏幕。這是updateUI方法,用於在數據加載後更新UI。
updateUI方法
private void updateUI(Student student)
{
if (student == null)
{
showProgressDialog(true);
return;
}
showProgressDialog(false);
ArrayList<StudentVm> studentVms = new ArrayList<>();
ArrayList<Course> courses = student.getCourses();
for (Course course : courses) {
StudentVm studentVm = new StudentVm(student.getmId(), course.getName(), Integer.valueOf(course.getCredit()).toString(), course.getGrade());
studentVms.add(studentVm);
}
Log.d(TAG, "About to display data...");
GradeListAdapter gradeAdapter = new GradeListAdapter(studentVms);
setListAdapter(gradeAdapter);
}
什麼是保持從顯示數據的片段?有誰之前經歷過這個嗎?如何解決這個問題?
編輯1: 下面是從數據庫中裝載學生數據的方法:
public Student queryStudent(String id)
{
Student stu = new Student();
Cursor cursor = db.query(DbConstants.STU_TABLE,
null, // all columns
DbConstants.STU_COLUMN_ID + "= ?", // look for a student ID
new String[]{id}, // with this value
null, // group by
null, // order by
null, // having
"1"); // limit 1 row)
cursor.moveToFirst();
int _id = 0;
while (!cursor.isAfterLast())
{
_id = cursor.getInt(cursor.getColumnIndex("_id"));
stu.setmId(cursor.getString(cursor.getColumnIndexOrThrow(DbConstants.STU_COLUMN_ID)));
stu.setFull_name(cursor.getString(cursor.getColumnIndexOrThrow(DbConstants.COLUMN_FNAME)));
stu.setAcademic_year(cursor.getInt(cursor.getColumnIndexOrThrow(DbConstants.COLUMN_ACYEAR)));
stu.setDepartment(cursor.getString(cursor.getColumnIndexOrThrow(DbConstants.COLUMN_DEPT)));
stu.setYear(cursor.getInt(cursor.getColumnIndexOrThrow(DbConstants.COLUMN_YEAR)));
}
cursor.close();
stu.set_id(_id);
return stu;
}
另外,logcat的持續顯示以下消息之後我關閉該應用程序在模擬器。
可能是數據庫關閉了? – 2015-10-04 13:17:50
你的意思是服務器數據庫?如果是這樣,我在首次啓動時存儲學生和課程數據後,從Android設備的本地數據庫加載數據。我再次重新啓動應用程序後出現問題。 – avidProgrammer
當您再次重新啓動應用程序時,數據未加載? – 2015-10-04 13:22:43