回收站视图显示为空白,并且不显示SQLite数据 [英] Recycler View appear blank and doesn't show SQLite data

查看:38
本文介绍了回收站视图显示为空白,并且不显示SQLite数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆