5

Hopefully simple java question I've just forgotten or never understood. I've been playing with Loaders in Android 4.0. The program is working as was but now I'm looking to the 'next' part. I want a standard Cursor loader and a custom AsyncTaskLoader. I'm stuck on part 1 trying to convert a cursorLoader to a Loader and return it.

@Override
    //public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    public Loader<Object> onCreateLoader(int id, Bundle args) {

        if (id == LISTVIEWLOADER) {
            String[] projection = { RunnerTable.COLUMN_ID,
                    RunnerTable.COLUMN_NAME };
            CursorLoader cursorLoader = new CursorLoader(getActivity(),
                    FanContentProvider.CONTENT_URI, projection, null, null,
                    null);


            return cursorLoader;   //HERE IS THE PROBLEM
        }
        return null;
    }

Type mismatch cannot convert from CursorLoader to Loader.

I believe can make it work with

public class MainFragment extends ListFragment implements
        //LoaderManager.LoaderCallbacks<Cursor>
        LoaderManager.LoaderCallbacks

But don't like the warning:

LoaderManager.LoaderCallbacks is a raw type. References to generic type LoaderManager.LoaderCallbacks should be parameterized

Thanks for any assistance you can provide.


iPhone App Local Database and Updating the App

I have an iPhone app which consists of local database (sqlite3). The database consists of a MyVegetableGarden table which stores data about user's vegetables.

When I push out an update to my application it clears the MyVegetableGarden table and user's database will be lost.

How can I prevent this from happening or maintain user's data.

4

5 回答 5

30

尽管这是一个旧线程,但尚未完全回答。tch0106 提到了这里的问题,但没有完全描述。

我刚刚遇到了同样的问题并在导入部分解决了它。简单来说:一起使用支持Loader、CursorLoader和LoaderCallbacks。

在 android 本地库和支持库中都可以找到几个类。不要将支持库与非支持库版本混用。

// Use these together
import android.support.v4.content.CursorLoader;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;

// Or use these, but don't mix and match
import android.content.CursorLoader;
import android.content.Loader;
import android.app.LoaderManager.LoaderCallbacks;
import android.widget.SimpleCursorAdapter;
于 2013-06-14T13:56:52.543 回答
7

检查您的导入,您可能会误用这两个:

import android.content.CursorLoader;

import android.support.v4.content.CursorLoader;
于 2012-12-02T06:19:00.290 回答
2

Change

public Loader<Object> onCreateLoader(int id, Bundle args) {

to

  public Loader<? extends Object> onCreateLoader(int id, Bundle args) {

First statement tells jvm, return type is concrete Object. New statement tells jvm that any TYPE which is of Object.

Please read this tutorial.

于 2012-10-24T21:16:05.887 回答
0

我已经通过更改导入解决了我的问题,与这个问题非常相似......当我声明自定义加载程序时,我犯了错误。

// My custom loader java class:

import android.content.Context;
import android.content.AsyncTaskLoader;  //this was the place of my mistake right here
import java.util.ArrayList;

public class ArticleLoader extends AsyncTaskLoader<ArrayList<Article>> {

    public ArticleLoader(Context context){
        super(context);
    }

    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Override
    public ArrayList<Article> loadInBackground() {
        ArrayList<Article> articles = QueryUtils.fetchArticles(getContext());
        return articles;
    }
}

所以,发生的事情是我没有足够注意,Android Studio 已经自动导入了“android.support.v4.content.AsyncTaskLoader”。

希望这对某人有帮助!

于 2017-06-27T20:14:11.853 回答
-1

看看这个: Android AsyncTaskLoader 参考

我相信您的问题出在这一行:

public class MainFragment extends ListFragment implements
    //LoaderManager.LoaderCallbacks<Cursor>
    LoaderManager.LoaderCallbacks

你应该改成这样:

public static class AppListFragment extends ListFragment
    implements LoaderManager.LoaderCallbacks<List<AppEntry>>
于 2013-05-21T09:54:59.363 回答