android-콘텐츠 제공자가없는 CursorLoader 및 SQLite
나는 이것이 논의되었지만 문제의 현재 상태에 대해 묻고 싶었습니다. sqlite 데이터베이스와 연결하여 CursorLoader를 사용하려면 ContentProvider를 만들어야합니까?
나는 발견했다
ContentProvider없이 CursorLoader 사용
Emmby가 언급했듯이 내가 원하는 것을 정확히 보여줍니다.
- 사용자는 한 가지 제한 사항을 알고 있어야합니다. 이는 데이터 변경시 새로 고치는 메커니즘이 없다는 것입니다 (로더가 수행해야하는 것처럼).
그래서 또 다른 해결책이 언급됩니다
https://github.com/commonsguy/cwac-loaderex
다시 한 번 몇 가지 단점이 지적되었습니다.
- 그러나 자동 재 쿼리를 사용하려면 UI와 업데이트에 동일한 로더를 사용해야하므로 백그라운드 서비스에 대한 유용성이 제한됩니다.
물론 LoaderManager를 사용할 때 도입 된 모든 이점을 얻고 싶습니다. 그래서 내 질문은 콘텐츠 제공자를 구현하지 않고도 sqlite 데이터베이스와 관련하여 LoaderManager를 사용하는 방법이 있지만 모든 이점을 가지고 있는지 여부입니다.
감사
게시물에서 언급 한 두 가지 구현 은 기본 콘텐츠가 변경 될 때 알림을받는 기능을 CursorLoader
제외하고 모두의 모든 이점을 제공합니다 .
나는 최근에 이것을 많이 조사해 왔으며 현재 Android API는 원시만으로이 작업을 수행하는 수단을 제공하지 않는다는 것을 확신 할 수 있습니다 SQLiteDatabase
( ContentResolver#notifyChange()
및 아래에 등록 된 Cursor#setNotificationUri()
모든에 알리는 데 사용되는 및 메서드 만 제공합니다. Cursor
특정 알림 Uri
).
즉, 지금 선택할 수있는 옵션은 다음과 같습니다.
SQLiteDatabase
콘텐츠가 변경 될 때 알림을받을 수있는 옵저버를 직접 구현하고 이러한 알림을Loader
애플리케이션의 모든 기존에 릴레이 할 수 있습니다. 이 도전에 응하고 싶다면 s 를 구현하는 방법에 대한 꽤 방대한 블로그 게시물 을 작성Loader
했습니다. 또는...Mark Murphy의
LoaderEx
라이브러리를 사용하고AsyncTask
그의 라이브러리가 제공 하는 작업을 사용하여 데이터베이스를 수정 합니다. 그의 작업이를 새로 고치는 이유 는 삽입 / 업데이트 / 삭제가 수행 된 직후 에Loader
를 호출 하여 콘텐츠가 변경되었으며 데이터를 새로 고쳐야 함을 효과적으로 알리기 때문 입니다.onContentChanged
Loader
Loader
a
ContentProvider
를 aCursorLoader
와 함께 사용하면이ContentResolver#notifyChange()
메서드를 사용하여CursorLoader
콘텐츠 변경이 발생했음을 알릴 수 있습니다 .
더 나은 솔루션을 찾으려고 노력하고 있으며, 하나를 찾거나 구현하면 나중에 다시보고 할 것이지만 지금은해야 할 일입니다.
내 onCreateLoader에 내 솔루션이 있습니다.
{
Uri u = Uri.parse("content://what_string_you_want");
return new CursorLoader(this, yourURI, projection, null, null, null) {
private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
@Override
public Cursor loadInBackground() {
Cursor c = YOUR_DATABASE.doYourQuery(...);
if (c != null) {
// Ensure the cursor window is filled
c.getCount();
c.registerContentObserver(mObserver);
}
c.setNotificationUri(getContext().getContentResolver(), getUri());
return c;
}
};
}
DB를 변경하는 코드 뒤에
getContentResolver().notifyChange(
Uri.parse("content://same_with_first_string"), null);
참조 URL : https://stackoverflow.com/questions/12869373/android-cursorloader-sqlite-without-content-provider
'programing' 카테고리의 다른 글
멤버 이니셜 라이저에서 'this'를 사용할 수없는 이유는 무엇입니까? (0) | 2021.01.15 |
---|---|
neo4j의 노드 식별자 (0) | 2021.01.15 |
네임 스페이스 종속성이 필요하지 않습니다. (0) | 2021.01.15 |
`hashCode`의 기본 구현은 무엇입니까? (0) | 2021.01.15 |
함수 포인터 유형 반환 (0) | 2021.01.15 |