Я пытался придерживаться 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должен вызываться только когда курсор действителен
Большое спасибо заранее за помощь!