There is my model. (Card with two questions)
public class Card implements Serializable {
private String firstQuestion;
private String secondQuestion;
public Card(String firstQuestion, String secondQuestion) {
this.firstQuestion = firstQuestion;
this.secondQuestion = secondQuestion;
}
public String getFirstQuestion() {
return firstQuestion;
}
public String getSecondQuestion() {
return secondQuestion;
}
}
This is my Activity. Adapter pass values from ArrayList to the ViewPager.
public class MainActivity extends FragmentActivity {
private ViewPager vpCardPager;
private PagerAdapter pagerAdapter;
private ArrayList<Card> cardList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cardList = DatabaseManager.cardsList;
vpCardPager = findViewById(R.id.vpCardPager);
FragmentManager fragmentManager = getSupportFragmentManager();
pagerAdapter = new FragmentPagerAdapter(fragmentManager) {
@NonNull
@Override
public Fragment getItem(int position) {
CardFragment cardFragment = CardFragment.newInstance(cardList.get(position));
return cardFragment;
}
@Override
public int getCount() {
return cardList.size();
}
};
vpCardPager.setAdapter(pagerAdapter);
}
}
In this class I create DataBase and try to pass values from cursor to ArrayList in MainActivity, but, when I start to debug, the debugger shows me that ArrayList in MainActivity is not filled with values. What I should do to fix this??
public class DatabaseManager extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "cards";
private static final int DATABASE_VERSION = 1;
public static final String FIRST_QUESTION = "firstQuestion";
public static final String SECOND_QUESTION = "secondQuestion";
public static final String TABLE_CARD = "Card";
public static final String ID = "_id";
public static ArrayList<Card> cardsList = new ArrayList<>();
SQLiteDatabase cardsDatabase;
public DatabaseManager(@Nullable Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(@NonNull SQLiteDatabase cardsDB) {
onUpdateDataBase(cardsDatabase);
}
@Override
public void onUpgrade(SQLiteDatabase cardsDB, int userDataBaseVersion, int SQLiteHelperDataBaseVersion) {
cardsDatabase.execSQL("DROP TABLE IF EXISTS " DATABASE_NAME);
onUpdateDataBase(cardsDatabase);
}
public void onUpdateDataBase(@NonNull SQLiteDatabase cardsDB) {
cardsDatabase.execSQL("CREATE TABLE " TABLE_CARD "("
ID " INTEGER PRIMARY KEY AUTOINCREMENT,"
FIRST_QUESTION " TEXT,"
SECOND_QUESTION " TEXT);");
insertCard(cardsDatabase, "one", "two");
insertCard(cardsDatabase, "three", "four");
insertCard(cardsDatabase, "five", "six");
setCardsList();
cardsDatabase.close();
}
public void insertCard(@NonNull SQLiteDatabase cardsDB,
String firstQuestion,
String secondQuestion) {
ContentValues cardsValues = new ContentValues();
cardsValues.put(FIRST_QUESTION, firstQuestion);
cardsValues.put(SECOND_QUESTION, secondQuestion);
cardsDatabase.insert(TABLE_CARD, null, cardsValues);
}
public void setCardsList() {
Cursor cursor = cardsDatabase.query(TABLE_CARD,
new String[]{ID, FIRST_QUESTION, SECOND_QUESTION},
null, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
while (cursor.moveToNext()) {
cardsList.add(new Card(cursor.getString(1), cursor.getString(2)));
}
}
cursor.close();
}
}
Just in case, I will attach the Fragment code
public class CardFragment extends Fragment {
public Card currentCard;
private TextView firstQuestion;
private TextView secondQuestion;
private static final String ARG_PARAM1 = "com.example.orgame.card";
public static CardFragment newInstance(Card card) {
CardFragment fragment = new CardFragment();
Bundle args = new Bundle();
args.putSerializable(ARG_PARAM1, card);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
currentCard = (Card) getArguments().getSerializable(ARG_PARAM1);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_card, container, false);
firstQuestion = rootView.findViewById(R.id.firstQuestion);
secondQuestion = rootView.findViewById(R.id.secondQuestion);
firstQuestion.setText(currentCard.getFirstQuestion());
secondQuestion.setText(currentCard.getSecondQuestion());
return rootView;
}
}
CodePudding user response:
SQLiteOpenHelper
has its own internal SQLiteDatabase
. You can get the database from the helper via a few get
functions like getWritableDatabase
, use those instead of your own SQLiteDatabase cardsDatabase;
which at no point in the provided code are you initializing it, meaning your probably getting a NPE
whenever you use the DatabaseManager
, thus the ArrayList
won't fill.