【问题标题】:Android Firebase Realtime databaseAndroid Firebase 实时数据库
【发布时间】:2017-06-03 05:50:38
【问题描述】:

我想使用 firebase 实时数据库更新所有设备的数据 我已经创建了应用程序,但它将数据本地存储在“SQLitedb”中。 但是,如果有人对 db 进行任何 CRUD 操作,那么它应该在所有设备中更新,这可能吗?

这里是 Person 类。

即使我使用 listview 来显示数据库中的所有记录。

public class Person {
// Labels table name
public static final String DATABASE_NAME = "PersonInfo.db";

// Labels Table Columns names
public static final String KEY_ROWID = "_id";
public static final String KEY_ID = "id";
public static final String CONTACTS_TABLE_NAME = "Person";
public static final String CONTACTS_COLUMN_FNAME = "FNAME";
public static final String CONTACTS_COLUMN_MNAME = "MNAME";
public static final String CONTACTS_COLUMN_LNAME = "LNAME";
public static final String CONTACTS_COLUMN_ADDRESS = "ADDRESS";
public static final String CONTACTS_COLUMN_YADINO = "YADINO";
public static final String CONTACTS_COLUMN_MOBILENO = "MOBILENO";
public static final String CONTACTS_COLUMN_VOTINGID = "VOTINGID";

// property help us to keep data
public int person_ID;
public String name;
public String email;
public int age;

public String fname;
public String mname;
public String lname;
public String address;
public String yadino;
public String mobileno;
public String votingid;


public int getPerson_ID() {
    return person_ID;
}

public void setPerson_ID(int person_ID) {
    this.person_ID = person_ID;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getFname() {
    return fname;
}

public void setFname(String fname) {
    this.fname = fname;
}

public String getMname() {
    return mname;
}

public void setMname(String mname) {
    this.mname = mname;
}

public String getLname() {
    return lname;
}

public void setLname(String lname) {
    this.lname = lname;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getYadino() {
    return yadino;
}

public void setYadino(String yadino) {
    this.yadino = yadino;
}

public String getMobileno() {
    return mobileno;
}

public void setMobileno(String mobileno) {
    this.mobileno = mobileno;
}

public String getVotingid() {
    return votingid;
}

public void setVotingid(String votingid) {
    this.votingid = votingid;
}
}

这是我对 db 执行操作的类。

公开课 StudentRepo { 私有 DBHelper dbHelper;

public StudentRepo(Context context) {
    dbHelper = new DBHelper(context);
}

public int insert(Person person) {

    //Open connection to write data
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(Person.CONTACTS_COLUMN_FNAME, person.getFname());
    values.put(Person.CONTACTS_COLUMN_MNAME, person.getMname());
    values.put(Person.CONTACTS_COLUMN_LNAME, person.getLname());
    values.put(Person.CONTACTS_COLUMN_ADDRESS, person.getAddress());
    values.put(Person.CONTACTS_COLUMN_YADINO,person.getYadino());
    values.put(Person.CONTACTS_COLUMN_MOBILENO, person.getMobileno());
    values.put(Person.CONTACTS_COLUMN_VOTINGID,person.getVotingid());

    // Inserting Row
    long student_Id = db.insert(Person.CONTACTS_TABLE_NAME, null, values);

    db.close(); // Closing database connection
    return (int) student_Id;
}
public Cursor  getStudentList() {
    //Open connection to read only
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    String selectQuery =  "SELECT  rowid as " +
            Person.KEY_ROWID + "," +
            Person.KEY_ID + "," +
            Person.CONTACTS_COLUMN_FNAME + "," +
            Person.CONTACTS_COLUMN_MNAME + "," +
            Person.CONTACTS_COLUMN_LNAME + "," +
            Person.CONTACTS_COLUMN_ADDRESS + "," +
            Person.CONTACTS_COLUMN_YADINO + "," +
            Person.CONTACTS_COLUMN_MOBILENO + "," +
            Person.CONTACTS_COLUMN_VOTINGID +
            " FROM " + Person.CONTACTS_TABLE_NAME;


    Cursor cursor = db.rawQuery(selectQuery, null);
    // looping through all rows and adding to list

    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return cursor;


}


public Cursor  getStudentListByKeyword(String search) {
    //Open connection to read only
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    String selectQuery =  "SELECT  rowid as " +
            Person.KEY_ROWID + "," +
            Person.KEY_ID + "," +
            Person.CONTACTS_COLUMN_FNAME + "," +
            Person.CONTACTS_COLUMN_MNAME + "," +
            Person.CONTACTS_COLUMN_LNAME + "," +
            Person.CONTACTS_COLUMN_ADDRESS + "," +
            Person.CONTACTS_COLUMN_YADINO + "," +
            Person.CONTACTS_COLUMN_MOBILENO + "," +
            Person.CONTACTS_COLUMN_VOTINGID +
            " FROM " + Person.CONTACTS_TABLE_NAME +
            " WHERE " +  Person.CONTACTS_COLUMN_FNAME + "  LIKE  '%" +search + "%' "
            ;


    Cursor cursor = db.rawQuery(selectQuery, null);
    // looping through all rows and adding to list

    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return cursor;


}

public Person getStudentById(int Id){

    SQLiteDatabase db = dbHelper.getReadableDatabase();
    String selectQuery =  "SELECT " +
            Person.KEY_ID + "," +
            Person.CONTACTS_COLUMN_FNAME + "," +
            Person.CONTACTS_COLUMN_MNAME + "," +
            Person.CONTACTS_COLUMN_LNAME + "," +
            Person.CONTACTS_COLUMN_ADDRESS + "," +
            Person.CONTACTS_COLUMN_YADINO + "," +
            Person.CONTACTS_COLUMN_MOBILENO + "," +
            Person.CONTACTS_COLUMN_VOTINGID +
            " FROM " + Person.CONTACTS_TABLE_NAME
            + " WHERE " +
            Person.KEY_ID + "=?";// It's a good practice to use parameter ?, instead of concatenate string

    int iCount =0;
    Person person = new Person();

    Cursor cursor = db.rawQuery(selectQuery, new String[] { String.valueOf(Id) } );

    if (cursor.moveToFirst()) {
        do {
            person.person_ID =cursor.getInt(cursor.getColumnIndex(Person.KEY_ID));
            person.setFname(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_FNAME)));
            person.setMname(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_MNAME)));
            person.setLname(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_LNAME)));
            person.setAddress(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_ADDRESS)));
            person.setYadino(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_YADINO)));
            person.setMobileno(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_MOBILENO)));
            person.setVotingid(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_VOTINGID)));

        } while (cursor.moveToNext());
    }

    cursor.close();
    db.close();
    return person;
}

public Person getStudentByName(String fname){
   // Log.d("SHAZ","ID OF STUDENT= "+String.valueOf(Id));
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    String selectQuery =  "SELECT " +
            Person.KEY_ID + "," +
            Person.CONTACTS_COLUMN_FNAME + "," +
            Person.CONTACTS_COLUMN_MNAME + "," +
            Person.CONTACTS_COLUMN_LNAME + "," +
            Person.CONTACTS_COLUMN_ADDRESS + "," +
            Person.CONTACTS_COLUMN_YADINO + "," +
            Person.CONTACTS_COLUMN_MOBILENO + "," +
            Person.CONTACTS_COLUMN_VOTINGID +
            " FROM " + Person.CONTACTS_TABLE_NAME
            + " WHERE " +
            Person.CONTACTS_COLUMN_FNAME + "=?";// It's a good practice to use parameter ?, instead of concatenate string

    int iCount =0;
    Person person = new Person();

    Cursor cursor = db.rawQuery(selectQuery, new String[] { String.valueOf(Person.CONTACTS_COLUMN_FNAME) } );

    if (cursor.moveToFirst()) {
        do {
            person.person_ID =cursor.getInt(cursor.getColumnIndex(Person.KEY_ID));
            person.setFname(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_FNAME)));
            person.setMname(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_MNAME)));
            person.setLname(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_LNAME)));
            person.setAddress(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_ADDRESS)));
            person.setYadino(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_YADINO)));
            person.setMobileno(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_MOBILENO)));
            person.setVotingid(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_VOTINGID)));

        } while (cursor.moveToNext());
    }

    cursor.close();
    db.close();
    return person;
}





}

这是我的 ListView 自定义适配器

public class CustomAdapter extends CursorAdapter {
private LayoutInflater mInflater;

public CustomAdapter(Context context, Cursor c, int flags) {
    super(context, c, flags);
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}


@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View   view    =    mInflater.inflate(R.layout.item, parent, false);
    ViewHolder holder  =   new ViewHolder();
    holder.txtId    =   (TextView)  view.findViewById(R.id.txtId);
    holder.txtFname    =   (TextView)  view.findViewById(R.id.txtdFname);
    holder.txtMname  =   (TextView)  view.findViewById(R.id.txtMname);
    holder.txtLname = (TextView)view.findViewById(R.id.txtLname);
    holder.txtVotingId = (TextView)view.findViewById(R.id.txtVotingId);
    view.setTag(holder);
    return view;
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    //If you want to have zebra lines color effect uncomment below code
    /*if(cursor.getPosition()%2==1) {
         view.setBackgroundResource(R.drawable.item_list_backgroundcolor);
    } else {
        view.setBackgroundResource(R.drawable.item_list_backgroundcolor2);
    }*/

    ViewHolder holder  =   (ViewHolder)    view.getTag();
    holder.txtId.setText(cursor.getString(cursor.getColumnIndex(Person.KEY_ID)));
    holder.txtFname.setText(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_FNAME)));
    holder.txtMname.setText(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_MNAME)));
    holder.txtLname.setText(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_LNAME)));
    holder.txtVotingId.setText(cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_VOTINGID)));

}

static class ViewHolder {
    TextView txtId;
    TextView txtFname;
    TextView txtMname;
    TextView txtLname;
    TextView txtVotingId;
}
}

这是我的 DBHelper 类

public class DBHelper  extends SQLiteOpenHelper {
//version number to upgrade database version
//each time if you Add, Edit table, you need to change the
//version number.
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "Person.db";

public DBHelper(Context context ) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    //All necessary tables you like to create will create here

    String CREATE_TABLE_STUDENT = "CREATE TABLE " + Person.CONTACTS_TABLE_NAME  + "("
            + Person.KEY_ID  + " INTEGER PRIMARY KEY AUTOINCREMENT ,"
            + "FNAME" + " TEXT, "
            + "MNAME" + " TEXT, "
            + "LNAME" + " TEXT, "
            + "ADDRESS" + " TEXT, "
            + "YADINO" + " TEXT, "
            + "MOBILENO" + " TEXT, "
            + "VOTINGID" + " TEXT )";

    db.execSQL(CREATE_TABLE_STUDENT);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed, all data will be gone!!!
    db.execSQL("DROP TABLE IF EXISTS " + Person.CONTACTS_TABLE_NAME);

    // Create tables again
    onCreate(db);

}

}

如果我在 firebase 中添加 person 对象,那么我将如何将其取回或将其本地保存在 db 中的其他设备上。

这是我的班级,我在其中获取 db 的所有输入。

public class AddPeopleActivity extends AppCompatActivity {
Person per = null;
StudentRepo student;
EditText eFname,eMname,eLname,eAddress,eYadiNo,eMobileNo,eVoterNo;
FancyButton btnAdd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_people);



    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    student = new StudentRepo(AddPeopleActivity.this);



    final Person person = new Person();

    //init of EditText's
    btnAdd = (FancyButton)findViewById(R.id.btnAddPeople);
    eFname = (EditText)findViewById(R.id.eFname);
    eMname = (EditText)findViewById(R.id.eMname);
    eLname = (EditText)findViewById(R.id.eLname);
    eAddress = (EditText)findViewById(R.id.eAddress);
    eYadiNo = (EditText)findViewById(R.id.eYadiNo);
    eMobileNo = (EditText)findViewById(R.id.eMobileNo);
    eVoterNo = (EditText)findViewById(R.id.eVoterNo);



    btnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("SHAZ","ADDPEOPLE ACTIVITY ONCLICK INVOKED");
            String efname = eFname.getText().toString();
            String emname = eMname.getText().toString();
            String elname = eLname.getText().toString();
            String eaddress = eAddress.getText().toString();
            String eyadi = eYadiNo.getText().toString();
            String emobileno = eMobileNo.getText().toString();
            String evoterno = eVoterNo.getText().toString();

            person.setFname(efname);
            person.setMname(emname);
            person.setLname(elname);
            person.setAddress(eaddress);
            person.setYadino(eyadi);
            person.setMobileno(emobileno);
            person.setVotingid(evoterno);

            if(person!=null) {

                student.insert(person);
                Toast.makeText(AddPeopleActivity.this, "Person Added Successfully", Toast.LENGTH_SHORT).show();
                per = null;
            }

             myRef.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    for(DataSnapshot userSnap:dataSnapshot.getChildren())
                    {
                        per = dataSnapshot.getValue(Person.class);
                        Cursor cursor = student.getStudentList();
                        String cVoting = cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_VOTINGID));
                        if(cVoting.equals(per.getVotingid()))
                        {
                            student.updateList(per);
                        }else{
                            student.insert(per);
                        }
                    }
                }
        }
    });

}

这就是我在 AddPeopleActivity 中所做的

 myRef.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    for(DataSnapshot userSnap:dataSnapshot.getChildren())
                    {
                        per = dataSnapshot.getValue(Person.class);
                        Cursor cursor = student.getStudentList();
                        String cVoting = cursor.getString(cursor.getColumnIndex(Person.CONTACTS_COLUMN_VOTINGID));
                        if(cVoting.equals(per.getVotingid()))
                        {
                            student.updateList(per);
                        }else{
                            student.insert(per);
                        }
                    }
                }

【问题讨论】:

    标签: android database sqlite listview firebase-realtime-database


    【解决方案1】:

    使用来自 firebase 的子事件侦听器。此侦听器有许多事件,例如添加、更改、移动、删除,并在数据库发生更改时触发。在这种方法中,您可以将更改保存在所有设备的本地数据库中。

    只要听孩子说话,就能看到魔法。 https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/database/ChildEventListener

    【讨论】:

    • 我已经添加了数据。 myRef.child(person.getVotingid()).setValue(person);。当我试图检索数据时,我得到了空对象? Person per = dataSnapshot.getValue(Person.class);
    • @Shaz 你真的能在 web firebase 控制台上看到数据吗?
    • 实际上我解决了上述问题,但现在我应该如何更新我尝试过的所有设备上的记录,但它不更新数据,甚至可能有重复 id 的机会?
    • 我应该在哪个活动中将数据插入到 Firebase 中,我应该在哪个活动中检索它?
    • 数据未更新:它有两个部分,1.您是否获得更新的数据? 2)如果是,那么我需要查看您的控制器并查看它为什么不更新。当用户保存数据或您想要的事件时,您应该在同一活动中插入数据。至于更新所有其他设备上的数据,要么保存在数据库中,要么保存在缓存中。我建议在 BaseActivity 中有这个子监听器并在那里采取你的行动。
    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 2022-01-19
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多