2011-09-28 28 views
44

Tôi đang sử dụng Thư viện tương thích Android trong dự án của mình. Tôi đã thiết lập ListFragment như mô tả trong DevGuide (http://developer.android.com/reference/android/app/Fragment.html), và sử dụng một CursorLoader Christian đơn giản được sử dụng mà không có nhà cung cấp nội dung (CursorLoader usage without ContentProvider).Các phương pháp hay nhất để truy vấn cơ sở dữ liệu SQLite trong ListFragment bằng CursorLoader?

Câu hỏi là ở đâu, trong hoạt động ListFragment/cha mẹ của tôi, tôi có nên mở cơ sở dữ liệu, trả về Con trỏ, tạo Bộ điều hợp và setListAdapter không?

Vì vậy, trong ứng dụng của tôi, tôi có TitlesFragment, DetailsFragment, FragmentLayoutActivity, DetailsLayoutActivity.

là việc thực hành tốt nhất ...

  • để mở cơ sở dữ liệu trong ListFragment của onActivityCreated và đóng nó trong ListFragment của onDestroy như trong mẫu mã bên dưới

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
        super.onActivityCreated(savedInstanceState); 
        // Open database 
        playersDatabaseHelper = new PlayersDBAdapter(getActivity()); 
        playersDatabaseHelper.open(); 
        getLoaderManager().initLoader(0, null, this); 
        ... 
    } 
    
    @Override 
    public void onDestroy() { 
        super.onDestroy(); 
        if (playersDatabaseHelper != null) { 
         playersDatabaseHelper.close(); 
        } 
    } 
    
  • cơ sở dữ liệu truy vấn và trả lại con trỏ trong onCreateLoader và tạo Bộ điều hợp và setListAdapter trong onLoadFinished như trong mẫu mã bên dưới

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
        // Now create and return a CursorLoader that will take care of 
        // creating a Cursor for the data being displayed. 
        return new MyCursorLoader(getActivity()) { 
         @Override 
         public Cursor loadInBackground() { 
          playersCursor = playersDatabaseHelper.getAllPlayers(); 
          return playersCursor; 
         } 
        }; 
    
    } 
    
    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {  
        // Create an empty adapter we will use to display the loaded data. 
        playersAdapter = new RowAdapter(getActivity(), playersCursor, R.layout.players_overview_row); 
    
        // Allocate the adapter to the List displayed within this fragment. 
        setListAdapter(playersAdapter); 
    
        playersAdapter.swapCursor(cursor); 
    
        // The list should now be shown. 
        if (isResumed()) { 
         setListShown(true); 
        } else { 
         setListShownNoAnimation(true); 
        } 
    } 
    

Tôi có đi đúng hướng hay tôi nên di chuyển một số thứ ở đâu đó? Cảm ơn vì đã dành thời gian cho tôi!

+0

Ai đó có thể nhận xét về câu hỏi của tôi, vui lòng. – micadelli

+0

Bạn đã bao giờ nhận được câu trả lời chưa? Tôi ngạc nhiên khi bạn có 14 phiếu bầu và không có câu trả lời nào. – kpierce8

+0

Yup, không bao giờ có câu trả lời: ( – micadelli

Trả lời

6

Xin lỗi, chưa có kinh nghiệm trong CursorLoader và Fragment, nhưng tôi đã có kinh nghiệm sử dụng SQLiteOpenHelper trong ngữ cảnh truy cập đồng thời theo các chủ đề khác nhau & hoạt động.

Tôi sẽ giả định rằng PlayersDBAdapter đang sử dụng nội bộ lớp SQLiteOpenHelper. nhưng không rõ phương thức của bạn mở() và close() đang làm gì?

Những gì tôi đã làm:

  • xác định SQLiteOpenHelper của bạn như một ứng dụng singleton rộng, không hoạt động rộng như bạn dường như làm
  • thuyết minh SQLiteOpenHelper trường hợp duy nhất trong ứng dụng của bạn onCreate
  • KHÔNG phát hành phiên bản SQLiteOpenHelper trong bất kỳ hoạt động nào trênDestroy, như khi một hoạt động dừng lại, một hoạt động khác có thể vẫn phải mở DB
  • Tôi đoán trường hợp SQLiteOpenHelper sẽ bị xóa trong ap quăn lại onTerminate (không chắc chắn như onTerminate là trong thực tế hầu như không bao giờ được gọi là)
  • Tôi có đối tượng DBAdapter mà được một tài liệu tham khảo SQLiteDatabase với mySQLiteOpenHelper.getWritableDatabase()
  • những DBAdapter thường được phân bổ vào các hoạt động onCreate và phát hành trong onDestroy

Ít nhất công việc này, không có sự cố trong một ứng dụng với hàng ngàn người dùng. Đề xuất cải thiện được hoan nghênh :-)

+1

Đó thực sự là một giải pháp tốt.Tôi đã sử dụng phương pháp này trong bốn ứng dụng của tôi và nó hoạt động như một sự quyến rũ. Tôi nhận được một lỗi thường xuyên trên Android 2.2 và dưới đây, nhưng với 2.3+ nó hoạt động như một say mê. –

+0

Ứng dụng của tôi tương thích với Android 1.5 và tôi không có ngoại lệ về điều này. Chỉ có kinh nghiệm hiếm "SQLiteDiskIOException: đĩa I/O lỗi" trên một số thiết bị cụ thể nhưng tôi giả sử nó có liên quan đến vấn đề truy cập Sdcard hoặc một cái gì đó như thế. – Thierry

Các vấn đề liên quan