回收站视图显示为空白,并且不显示SQLite数据 [英] Recycler View appear blank and doesn't show SQLite data
问题描述
我试图在SQLite数据库类"DatabaseHandler"的回收器视图中显示数据
I am trying to show data in a recycler view from SQLite database class "DatabaseHandler"
公共类DatabaseHandler扩展了SQLiteOpenHelper {
public class DatabaseHandler extends SQLiteOpenHelper {
// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "NewPersonManager";
// New Person table name
private static final String TABLE_NEW_PERSON = "newPerson";
// New Person Table Columns names
private static final String KEY_NAME = "name";
private static final String KEY_ID = "id";
private static final String KEY_FACEBOOK_ID = "facebook_id";
private static final String KEY_TWITTER_ID = "twitter_id";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_NEW_PERSON_TABLE = "CREATE TABLE " + TABLE_NEW_PERSON +
"("+KEY_ID + " INTEGER PRIMARY KEY,"+ KEY_NAME + " TEXT, " + KEY_FACEBOOK_ID + " TEXT," + KEY_TWITTER_ID + " TEXT " + ")";
db.execSQL(CREATE_NEW_PERSON_TABLE);
}
// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NEW_PERSON);
// Create tables again
onCreate(db);
}
// Adding new contact
public void addNewPerson(New_Person_data newPerson) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, newPerson.getmUserName()); // Person Name
values.put(KEY_FACEBOOK_ID, newPerson.getmFacebookId()); // Person Facebook ID
values.put(KEY_TWITTER_ID, newPerson.getmTwitterId()); //Person Twitter ID
// Inserting Row
db.insert(TABLE_NEW_PERSON, null, values);
db.close(); // Closing database connection
}
// Getting single Person
public New_Person_data getPerson(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NEW_PERSON, new String[] {KEY_ID,KEY_NAME, KEY_FACEBOOK_ID,
KEY_TWITTER_ID }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
New_Person_data newPerson = new New_Person_data
( Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2));
// return New Person
return newPerson;
}
// Getting All Persons
public List<New_Person_data> getAllPeople() {
List<New_Person_data> PeopleList = new ArrayList<New_Person_data>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_NEW_PERSON;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
New_Person_data newPerson = new New_Person_data();
newPerson.setID(Integer.parseInt(cursor.getString(0)));
newPerson.setmUserName(cursor.getString(1));
newPerson.setmFacebookId(cursor.getString(2));
newPerson.setmTwitterId(cursor.getString(2));
// Adding person to list
PeopleList.add(newPerson);
} while (cursor.moveToNext());
}
// return people list
return PeopleList;
}
// Getting PEOPLE Count
public int getPeopleCount() {
String countQuery = "SELECT * FROM " + TABLE_NEW_PERSON;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// return count
return cursor.getCount();
}
// Updating single person
public int updatePerson(New_Person_data new_person_data) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, new_person_data.getmUserName());
values.put(KEY_FACEBOOK_ID, new_person_data.getmFacebookId());
values.put(KEY_FACEBOOK_ID, new_person_data.getmTwitterId());
// updating row
return db.update(TABLE_NEW_PERSON, values, KEY_ID + " = ?",
new String[] { String.valueOf(new_person_data.getID()) });
}
// Deleting single person
public void deletePerson(New_Person_data newPerson) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_NEW_PERSON, KEY_ID + " = ?",
new String[] { String.valueOf(newPerson.getID()) });
db.close();
}
}
并在用户单击Add_New_Person片段中的DONE图标时保存数据
and save the data when user clicked on DONE icon from Add_New_Person fragment
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId =item.getItemId();
New_Person_data new_person_data;
if(itemId == R.id.new_person_done)
userName = mUserName.getText().toString();
facebookId = mFacebookId.getText().toString();
twitterId = mTwitterId.getText().toString();
// after user click done image , add new person row
new_person_data= new New_Person_data(userName,facebookId,twitterId);
databaseHandler.addNewPerson(new_person_data);
getActivity().finish();
return true;
}
在另一个片段中,我制作了一个方法来获取"People"类的数组,该数组具有一个带有一个String参数"userName"的约束条件,该参数是从New_Person_Class获得的...
In another fragment, I made a method to get an array of "People" class that has a constractur with one String parameter "userName which I get it from New_Person_Class...
`private void preparePeopleData(){
`private void preparePeopleData() {
DatabaseHandler databaseHandler = new DatabaseHandler(this.getContext());
// List to get all people from database
List<New_Person_data> peopleArrayList = databaseHandler.getAllPeople();
//get people's user name and add to people class to show in recycler view
for (New_Person_data newPerson:peopleArrayList) {
People People = new People(newPerson.getmUserName());
PeopleList.add(People);
}
Log.d("Peple Array size ", String.valueOf(peopleArrayList.size()));
// sort user name from A-Z
Collections.sort(PeopleList, new Comparator<People>() {
@Override
public int compare(People lhs, People rhs) {
return lhs.getPerson().compareTo(rhs.getPerson());
}
});
// set the new changes of data
mAdapter.notifyDataSetChanged();
}`
在运行应用程序并插入日期后,在添加新人"活动中单击三个编辑文本,然后单击完成",将显示空白的回收站视图.
At the end after running app and insert date an three edit Text in the Add New Person activity and click done it shows blank recycler view.
编辑* 我发现数据仅在再次运行该应用程序后才会出现,因此每次我需要显示添加的项目时,我都需要再次运行该应用程序..为什么它没有立即更新?
Edit* I found that the data does appear only after running the app again, so every time I need to show the added item I need to run the app again .. why it's not updated immediately?
推荐答案
Override onStart方法解决的问题,并调用将数据提供给回收者视图的方法.
Problem solved by Override onStart method and invoke the method that gives data to the recycler view.
@Override
public void onStart() {
super.onStart();
preparePeopleData();
}
这篇关于回收站视图显示为空白,并且不显示SQLite数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!