как сохранить / переместить данные firebase в SQLite - PullRequest
0 голосов
/ 16 июня 2020

У меня есть приложение, в котором я могу добавлять экзамены, уроки и т. Д. c. Я сохраняю эти данные в SQLite, но теперь мне нужно реализовать Firebase. Сохранить данные в firebase легко, я могу запрограммировать его в той же функции, где я сохраняю данные в SQLite, проблема в том, что если пользователь удаляет приложение, база данных SQLite удаляется, и я читаю все свои данные из SQLite. Итак, мне нужно прочитать данные из firebase и сохранить их в SQlite, если данных SQLite нет.

My SQLiteOpenHelper

public class DBOpenHelper extends SQLiteOpenHelper {

//CREATE Y DROP DE EVENTOS
private static final String CREATE_EVENTS_TABLE = "create table "+DbStructure.EVENT_TABLE_NAME+"(ID INTEGER PRIMARY KEY AUTOINCREMENT, "
        +DbStructure.EVENT+" TEXT, "+DbStructure.TIME+" TEXT, "+DbStructure.DATE+" TEXT, "+DbStructure.MONTH+" TEXT, "
        +DbStructure.YEAR+" TEXT, "+DbStructure.Notify+" TEXT)";
private static final String  DROP_EVENTS_TABLE= "DROP TABLE IF EXISTS "+DbStructure.EVENT_TABLE_NAME;

//CREATE Y DROP DE PERIODO
private static final String CREATE_PERIOD_TABLE = "create table " +DbStructure.PERIOD_TABLE_NAME+"(IDPERIOD INTEGER PRIMARY KEY AUTOINCREMENT, "+DbStructure.START_DATE + " TEXT, "
        + DbStructure.FINISH_DATE +" TEXT)";

private static final String  DROP_PERIOD_TABLE= "DROP TABLE IF EXISTS "+DbStructure.PERIOD_TABLE_NAME;

//CREATE Y DROP DE RECORDATORIOS
private static final String CREATE_REMINDER_TABLE = "create table " + DbStructure.REMINDER_TABLE_NAME + "(" + DbStructure.REC_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, " + DbStructure.REC_TITLE + " TEXT, "
        + DbStructure.REC_BODY + " TEXT, " + DbStructure.REC_TIME + " TEXT)";

private static final String DROP_REC_TABLE= "DROP TABLE IF EXISTS " + DbStructure.REMINDER_TABLE_NAME;

//CREATE Y DROP DE CLASES
private static final String CREATE_CLASS_TABLE = "create table " + DbStructure.CLASS_TABLE_NAME + "(" + DbStructure.CLASS_ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + DbStructure.CLASS_NAME + " TEXT, "
        + DbStructure.CLASS_TUTOR + " TEXT)";

private static final String DROP_CLASS_TABLE = "DROP TABLE IF EXISTS " + DbStructure.CLASS_TABLE_NAME;

//CREATE Y DROP DE EXAMENES
private static final String CREATE_EXAM_TABLE = "create table " + DbStructure.EXAM_TABLE_NAME + "(" + DbStructure.EXAM_ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + DbStructure.EXAM_DESCRIPTION
        + " TEXT, " + DbStructure.EXAM_NOTA + " TEXT, " + DbStructure.EXAM_FECHA + " TEXT, " + DbStructure.EXAM_CLASS_ID + " INTEGER)";

private static final String DROP_EXAM_TABLE = "DROP TABLE IF EXISTS " + DbStructure.EXAM_TABLE_NAME;
public DBOpenHelper(@Nullable Context context) {
    super(context, DbStructure.DB_NAME, null, DbStructure.DB_VERSION);

}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_EVENTS_TABLE);
    db.execSQL(CREATE_PERIOD_TABLE);
    db.execSQL(CREATE_REMINDER_TABLE);
    db.execSQL(CREATE_CLASS_TABLE);
    db.execSQL(CREATE_EXAM_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(DROP_EVENTS_TABLE);
    db.execSQL(DROP_PERIOD_TABLE);
    db.execSQL(DROP_REC_TABLE);
    db.execSQL(DROP_CLASS_TABLE);
    db.execSQL(DROP_EXAM_TABLE);
    onCreate(db);
}


//SAVE,READ,DELETE Y UPDATE DE EXAMES
public void SaveExam (String descripcion,String nota,String fecha,int classid,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.EXAM_DESCRIPTION,descripcion);
    contentValues.put(DbStructure.EXAM_NOTA,nota);
    contentValues.put(DbStructure.EXAM_FECHA,fecha);
    contentValues.put(DbStructure.EXAM_CLASS_ID,classid);
    database.insert(DbStructure.EXAM_TABLE_NAME,null,contentValues);

}

public Cursor ReadExams (int idclase,SQLiteDatabase database){
   String selection = DbStructure.EXAM_CLASS_ID+ "=?";
   String [] selectionArgs = {String.valueOf(idclase)};
   String [] Projections = {DbStructure.EXAM_ID,DbStructure.EXAM_DESCRIPTION,DbStructure.EXAM_NOTA,DbStructure.EXAM_FECHA};
   return database.query(DbStructure.EXAM_TABLE_NAME,Projections,selection,selectionArgs,null,null,null);
}

public void deleteSingleExam(int id,SQLiteDatabase database){
    String selection = DbStructure.EXAM_ID+"=?";
    String [] selectionArgs = {String.valueOf(id)};
    database.delete(DbStructure.EXAM_TABLE_NAME,selection,selectionArgs);
}

public void updateExam(int id,String nom,String nota,String fecha,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.EXAM_DESCRIPTION,nom);
    contentValues.put(DbStructure.EXAM_NOTA,nota);
    contentValues.put(DbStructure.EXAM_FECHA,fecha);
    String selection = DbStructure.EXAM_ID+"=?";
    String [] selectionArgs = {String.valueOf(id)};
    database.update(DbStructure.EXAM_TABLE_NAME,contentValues,selection,selectionArgs);
}

public void deleteAllExams(int idClass,SQLiteDatabase database){
    String selection = DbStructure.EXAM_CLASS_ID+"=?";
    String [] selectionArgs = {String.valueOf(idClass)};
    database.delete(DbStructure.EXAM_TABLE_NAME,selection,selectionArgs);
}


//SAVE,READ,DELETE Y UPDATE DE CLASES
public void SaveClass (String nom,String tutor,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.CLASS_NAME,nom);
    contentValues.put(DbStructure.CLASS_TUTOR,tutor);
    database.insert(DbStructure.CLASS_TABLE_NAME,null,contentValues);
}

public void deleteClass (int id , SQLiteDatabase database){
    deleteAllExams(id,database);
    String selection = DbStructure.CLASS_ID+"=?";
    String [] selectionArg ={String.valueOf(id)};
    database.delete(DbStructure.CLASS_TABLE_NAME,selection,selectionArg);
}

public void updateClass(int id,String nom,String tutor,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.CLASS_NAME,nom);
    contentValues.put(DbStructure.CLASS_TUTOR,tutor);
    String selection = DbStructure.CLASS_ID + "=?";
    String [] SelectionArgs = {String.valueOf(id)};
    database.update(DbStructure.CLASS_TABLE_NAME,contentValues,selection,SelectionArgs);
}

public Cursor ReadClass(SQLiteDatabase database){
    String [] Projections = {DbStructure.CLASS_ID,DbStructure.CLASS_NAME,DbStructure.CLASS_TUTOR};
    return database.query(DbStructure.CLASS_TABLE_NAME,Projections,null,null,null,null,null);
}

//READ Y SAVE PERIOD
public void SavePeriod (String fecInico,String fecFinal,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.START_DATE,fecInico);
    contentValues.put(DbStructure.FINISH_DATE,fecFinal);

    database.insert(DbStructure.PERIOD_TABLE_NAME,null,contentValues);

}

public Cursor ReadPeriod(SQLiteDatabase database){
    String [] Projections = {"IDPERIOD",DbStructure.START_DATE,DbStructure.FINISH_DATE};
    return database.query(DbStructure.PERIOD_TABLE_NAME,Projections,null,null,null,null,null);
}

public void updatePeriod(int id,String fecInico,String fecFinal,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.START_DATE,fecInico);
    contentValues.put(DbStructure.FINISH_DATE,fecFinal);
    String selection = "IDPERIOD=?";
    String [] selectionArgs = {String.valueOf(id)};
    database.update(DbStructure.PERIOD_TABLE_NAME,contentValues,selection,selectionArgs);

}





//SAVE,DELETE,UPDATE,READ DE RECORDATORIOS
public void SaveReminder(String titulo,String cuerpo,String hora,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.REC_TITLE,titulo);
    contentValues.put(DbStructure.REC_BODY,cuerpo);
    contentValues.put(DbStructure.REC_TIME,hora);
    database.insert(DbStructure.REMINDER_TABLE_NAME,null,contentValues);
}

public Cursor ReadReminder(SQLiteDatabase database){
    String [] Projections = {DbStructure.REC_ID,DbStructure.REC_TITLE,DbStructure.REC_BODY,DbStructure.REC_TIME};
    return database.query(DbStructure.REMINDER_TABLE_NAME,Projections,null,null,null,null,null);
}

public void deleteReminder(int id,SQLiteDatabase database){
    String selection = DbStructure.REC_ID+"=?";
    String [] selectionArg ={String.valueOf(id)};
    database.delete(DbStructure.REMINDER_TABLE_NAME,selection,selectionArg);
}

public void updateReminder(int id ,String titulo,String cuerpo,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.REC_TITLE,titulo);
    contentValues.put(DbStructure.REC_BODY,cuerpo);
    String selection = DbStructure.REC_ID+"=?";
    String [] SelectionArgs = {String.valueOf(id)};
    database.update(DbStructure.REMINDER_TABLE_NAME,contentValues,selection,SelectionArgs);
}


//SAVE,DELETE,READ Y UPDATE DE EVENTOS
public void SaveEvent(String event,String time,String date,String month,String year,String notify,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.EVENT,event);
    contentValues.put(DbStructure.TIME,time);
    contentValues.put(DbStructure.DATE,date);
    contentValues.put(DbStructure.MONTH,month);
    contentValues.put(DbStructure.YEAR,year);
    contentValues.put(DbStructure.Notify,notify);
    database.insert(DbStructure.EVENT_TABLE_NAME,null,contentValues);

}

public void deleteEvent(String event,String date,String time,SQLiteDatabase database){
    String selection = DbStructure.EVENT+"=? and "+DbStructure.DATE+"=? and "+DbStructure.TIME+"=?";
    String[] selectionArg = {event,date,time};
    database.delete(DbStructure.EVENT_TABLE_NAME,selection,selectionArg);
}

public void updateEvent(String date,String event, String  time,String notify,SQLiteDatabase database){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DbStructure.Notify,notify);
    String Selection = DbStructure.DATE +"=? and "+DbStructure.EVENT+"=? and "+DbStructure.TIME+"=?";
    String [] SelectionArgs = {date,event,time};
    database.update(DbStructure.EVENT_TABLE_NAME,contentValues,Selection,SelectionArgs);
}

public Cursor ReadEventsperMonth(String month,String year,SQLiteDatabase database){
    String [] Projections = {DbStructure.EVENT,DbStructure.TIME,DbStructure.DATE,DbStructure.MONTH,DbStructure.YEAR};
    String Selection = DbStructure.MONTH +"=? and "+DbStructure.YEAR+"=?";
    String [] SelectionArgs = {month,year};
    return database.query(DbStructure.EVENT_TABLE_NAME,Projections,Selection,SelectionArgs,null,null,null);
}

public Cursor ReadEvents(String date,SQLiteDatabase database){
    String [] Projections = {DbStructure.EVENT,DbStructure.TIME,DbStructure.DATE,DbStructure.MONTH,DbStructure.YEAR};
    String Selection = DbStructure.DATE +"=?";
    String [] SelectionArgs = {date};

    return database.query(DbStructure.EVENT_TABLE_NAME,Projections,Selection,SelectionArgs,null,null,null);
}

public Cursor ReadIDEvents(String date,String event, String  time,SQLiteDatabase database){
    String [] Projections = {DbStructure.ID,DbStructure.Notify,DbStructure.TIME};
    String Selection = DbStructure.DATE +"=? and "+DbStructure.EVENT+"=? and "+DbStructure.TIME+"=?";
    String [] SelectionArgs = {date,event,time};

    return database.query(DbStructure.EVENT_TABLE_NAME,Projections,Selection,SelectionArgs,null,null,null);
}

}

Вот где я есть все функции, которые сохраняют данные в SQLite.

Это мои FragmentLessons

public class ClasesFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

public static View v;
public static Button btAdd;
public static RecyclerView rvClases;
EditText etNombre, etTutor;
Button btnRegistrar;
Button btPrueba;
Dialog alerta;
public static DBOpenHelper dbOpenHelper;
public static Context context;


public ClasesFragment() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment ClasesFragment.
 */
// TODO: Rename and change types and number of parameters
public static ClasesFragment newInstance(String param1, String param2) {
    ClasesFragment fragment = new ClasesFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }

}

@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    v = inflater.inflate(R.layout.fragment_clases, container, false);
    rvClases = (RecyclerView) v.findViewById(R.id.recyclerview);
    btAdd = (Button) v.findViewById(R.id.btadd);
    context = getContext();
    refreshRecyclerClass();
    btAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LayoutInflater inflater1 = getLayoutInflater();
            final View dialog = inflater1.inflate(R.layout.dialog,null);

            final AlertDialog.Builder builderdialog = new AlertDialog.Builder(getActivity());
            builderdialog.setView(dialog);
            etNombre = (EditText) dialog.findViewById(R.id.etNombre);
            etTutor = (EditText) dialog.findViewById(R.id.etTutor);
            btnRegistrar = (Button) dialog.findViewById(R.id.btnRegistrar);
            btnRegistrar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    saveClassX(etNombre.getText().toString(),etTutor.getText().toString());
                    refreshRecyclerClass();
                    alerta.dismiss();
                }
            });
            alerta = builderdialog.show();

        }
    });
    return v;


}

public void refreshRecyclerClass(){
    getClasslist();
    rvClases = (RecyclerView) v.findViewById(R.id.recyclerview);
    RecyclerClases adap = new RecyclerClases(MainActivity.listaclases,getContext());
    rvClases.setLayoutManager(new LinearLayoutManager(getActivity()));
    rvClases.setAdapter(adap);
}



private void saveClassX(String nom,String tutor){
    dbOpenHelper = new DBOpenHelper(context);
    SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
    dbOpenHelper.SaveClass(nom,tutor,database);
    dbOpenHelper.close();

}

public static void getClasslist(){
    MainActivity.listaclases.clear();
    dbOpenHelper = new DBOpenHelper(context);
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor c = dbOpenHelper.ReadClass(db);
    while (c.moveToNext()){
        int id = c.getInt(c.getColumnIndex(DbStructure.CLASS_ID));
        String nom = c.getString(c.getColumnIndex(DbStructure.CLASS_NAME));
        String tutor = c.getString(c.getColumnIndex(DbStructure.CLASS_TUTOR));
        Clase clase = new Clase(id,nom,tutor);
        MainActivity.listaclases.add(clase);
    }
    c.close();
    dbOpenHelper.close();
}

}

Как вы видите, функция saveClassX вызывает функцию saveClass из Класс SQLiteOpenHelper, здесь я сохраняю данные.

И функция getClassList - это функция, которая считывает данные из Sqlite, вызывая также функцию ReadClass из SQliteOpenhelper. По сути, все мое приложение работает так

Итак, проблема в том, что если пользователь добавляет данные, мне нужно сохранить их в SQLite и в Firebase, но если пользователь удаляет приложение, SQlite db удаляется, даже если есть данные в firebase, и я прочитал свои данные из SQLite, поэтому у меня нет данных.

КАК ПЕРЕМЕСТИТЬ ВСЕ ДАННЫЕ ИЗ FIREBASE В SQLITE, ЕСЛИ БАЗА ДАННЫХ SQLITE НЕ СУЩЕСТВУЕТ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...