2015-10-04 85 views
1

我正在研究一個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的持續顯示以下消息之後我關閉該應用程序在模擬器。

Logcat message

+0

可能是數據庫關閉了? – 2015-10-04 13:17:50

+0

你的意思是服務器數據庫?如果是這樣,我在首次啓動時存儲學生和課程數據後,從Android設備的本地數據庫加載數據。我再次重新啓動應用程序後出現問題。 – avidProgrammer

+0

當您再次重新啓動應用程序時,數據未加載? – 2015-10-04 13:22:43

回答

0

後再次分析代碼,我發現該錯誤是一個相當簡單的錯誤這是我忘了在其中學生數據加載while循環添加cursor.moveToNext()。這導致了一個無限循環,它阻止了應用程序加載數據。

相關問題