firebase 실시간 데이터베이스를 사용하는 모든 기기의 데이터를 업데이트하고 싶습니다. 저는 앱을 만들었지 만 데이터는 'SQLitedb'에 로컬로 저장합니다. 누군가가 db에서 CRUD 작업을 수행한다면 모든 장치에서 업데이트해야합니다.Android Firebase 실시간 데이터베이스
여기 Person 클래스 클래스입니다.
심지어 나는 listview를 사용하여 db의 모든 레코드를 표시합니다.
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에서 작업을 수행하는 클래스입니다.
public class StudentRepo { private 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;
}
}
이리스트 뷰
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;
}
}
에 대한 나의 CustomAdapter입니다 그리고 내가 중포 기지에서 사람 개체를 추가하는 경우이 내가 다시 검색 할 수 방법 다음 내 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);
}
}
입니다 또는 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);
}
}
}
데이터를 추가했습니다. ** myRef.child (person.getVotingid()). setValue (person); **. 그리고 내가 데이터를 얻으려고 할 때, 객체가 null이 되었습니까? ** Person 당 = dataSnapshot.getValue (Person.class); ** –
@Shaz 웹 firebase 콘솔에서 실제로 데이터를 볼 수 있습니까? – Hitesh
사실 난 위의 문제를 해결하지만 지금은 어떻게 모든 장치에서 레코드를 업데이 트해야했는데 노력했는데 그것은 데이터를 업데이 트하지 않으며 심지어 ID의 중복의 기회가 될 수 있을까? –