Как адаптировать startManagingCursor () к не осуждаемому методу? - PullRequest
0 голосов
/ 10 декабря 2018

Я пытался придерживаться startManagingCursor() для моей базы данных SQLite только для чтения, но она выдает много ошибок, даже если я использую stopManagingCursor() (да, я знаю , они устарели ).

Я хотел бы получить некоторую помощь, чтобы узнать, как перейти от управления курсорами к лучшему методу без особых изменений, поскольку я никогда не использовал их, и этот код почему-то стабилен, хотя всплывают случайные ошибкивремя от времени из-за startManagingCursor() (в одном приложении активности он работает нормально, но при использовании его в качестве фрагмента в многофрагментном приложении это действительно проблематично).

Однако, когда я простоизмените startManagingCursor() на getLoaderManager(), это все еще работает, но документация также говорит, что он устарел и указывает getSupportLoaderManager(), и, когда я использую это, оно вычеркивается, как будто это также устарело (Lint говорит«getSupportLoaderManager() устарела», но не говорит то же самое для getLoaderManager());и те могут выдавать java.lang.NullPointerException того, что не происходило с startManagingCursor(cursor), хотя оба они работоспособны.

Так что мне тогда делать?

Фрагмент SQLite такой:

public class SQLiteDatabaseActivity extends Fragment {

    public static SQLiteDatabaseActivity newInstance() {
        return new SQLiteDatabaseActivity();
    }

    ExpandableListView expandableListView;
    Database mDatabase;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.sqlite_database_activity, container, false);

        mDatabase = new Database(getActivity());
        mDatabase.open();

        Cursor cursor = mDatabase.getDatabase();
        getActivity().startManagingCursor(cursor);

        String[] groupFrom = {
                Database.DATABASE_GROUP_1,
                Database.DATABASE_GROUP_2,
                Database.DATABASE_GROUP_3,
                Database.DATABASE_GROUP_4
        };

        int[] groupTo = {
                R.id.group_number,
                R.id.group_name,
                R.id.group_path,
                R.id.group_company
        };

        String[] childFrom = new String[]{
                Database.DATABASE_CHILD_1,
                Database.DATABASE_CHILD_2,
                Database.DATABASE_CHILD_3,
                Database.DATABASE_CHILD_4,
                Database.DATABASE_CHILD_5,
                Database.DATABASE_CHILD_6,
                Database.DATABASE_CHILD_7,
                Database.DATABASE_CHILD_8,
                Database.DATABASE_CHILD_9,
                Database.DATABASE_CHILD_10,
                Database.DATABASE_CHILD_11,
                Database.DATABASE_CHILD_12
        };

        int[] childTo = {
                R.id.child1,
                R.id.child2,
                R.id.child_saturday_origin,
                R.id.child_saturday_destiny,
                R.id.child_sunday_origin,
                R.id.child_sunday_destiny,
                R.id.child_origin,
                R.id.child_destiny,
                R.id.child_saturday_origin_origin,
                R.id.child_saturday_destiny_destiny,
                R.id.child_sunday_origin_origin,
                R.id.child_sunday_destiny_destiny
        };

        SimpleCursorTreeAdapter simplecursortreeAdapter = new ExpandableListViewAdapter(
                getActivity(),
                cursor,
                R.layout.sqlite_database_list_group,
                groupFrom,
                groupTo,
                R.layout.sqlite_database_list_child,
                childFrom,
                childTo
        );

        expandableListView = view.findViewById(R.id.expandableListview);
        expandableListView.setAdapter(simplecursortreeAdapter);

        getActivity().stopManagingCursor(cursor);

        return view;
    }

    private class ExpandableListViewAdapter extends SimpleCursorTreeAdapter {
        private ExpandableListViewAdapter(
                Context context,
                Cursor cursor,
                int groupLayout,
                String[] groupFrom,
                int[] groupTo,
                int childLayout,
                String[] childFrom,
                int[] childTo) {
            super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childFrom, childTo);
        }

        protected Cursor getChildrenCursor(Cursor groupCursor) {
            return mDatabase.getID(groupCursor.getInt(groupCursor.getColumnIndex(Database.DATABASE_ID)));
        }
    }

    public void onDestroy() {
        super.onDestroy();
        mDatabase.close();
    }
}

База данных находится здесь:

public class Database {

    private static final int DATABASE_VERSION = 3;
    private static final String DATABASE_NAME = "BusScheduleDatabase.db";
    private static final String DATABASE_TABLE = "BusSchedule";
    public static final String DATABASE_ID = "_id";
    public static final String DATABASE_GROUP_1 = "Linha";
    public static final String DATABASE_GROUP_2 = "Nome";
    public static final String DATABASE_GROUP_3 = "Caminho";
    public static final String DATABASE_GROUP_4 = "Empresa";
    public static final String DATABASE_CHILD_1 = "SemanaIda";
    public static final String DATABASE_CHILD_2 = "SemanaVolta";
    public static final String DATABASE_CHILD_3 = "SabadoIda";
    public static final String DATABASE_CHILD_4 = "SabadoVolta";
    public static final String DATABASE_CHILD_5 = "DomingoIda";
    public static final String DATABASE_CHILD_6 = "DomingoVolta";
    public static final String DATABASE_CHILD_7 = "Origem";
    public static final String DATABASE_CHILD_8 = "Destino";
    public static final String DATABASE_CHILD_9 = "Origem";
    public static final String DATABASE_CHILD_10 = "Destino";
    public static final String DATABASE_CHILD_11 = "Origem";
    public static final String DATABASE_CHILD_12 = "Destino";

    private final Context mContext;
    private DatabaseHelper mDatabaseHelper;
    private SQLiteDatabase mDB;

    public Database(Context context) {
        mContext = context;
    }

    public void open() {
        mDatabaseHelper = new DatabaseHelper(mContext, DATABASE_NAME, null, DATABASE_VERSION);
        mDB = mDatabaseHelper.getReadableDatabase();
    }

    public void close() {
        if (mDatabaseHelper != null) mDatabaseHelper.close();
    }

    public Cursor getDatabase() {
        return mDB.query(DATABASE_TABLE, null, null, null, null, null, DATABASE_GROUP_1);
    }

    public Cursor getID(long rowID) {
        return mDB.query(DATABASE_TABLE, null, "_id" + " = "
                + rowID, null, null, null, null);
    }

    public class DatabaseHelper extends SQLiteAssetHelper {

        public DatabaseHelper(Context mContext, String DATABASE_NAME, SQLiteDatabase.CursorFactory factory, int DATABASE_VERSION) {
            super(mContext, DATABASE_NAME, factory, DATABASE_VERSION);
            super.setForcedUpgrade();
        }
    }

}

И повторяющаяся ошибка в основном следующая:

  • java.lang.IllegalStateException: thisдолжен вызываться только когда курсор действителен

Большое спасибо заранее за помощь!

...