Как получить данные с сервера и заполнить базу данных SQL на Android? - PullRequest
1 голос
/ 10 ноября 2019

Я хочу загрузить данные из Firebase Firestore (массив имен), создать таблицу SQL и заполнить таблицу данными с сервера. И каждый раз, когда я запускаю приложение, я проверяю номер версии из firebase, если он совпадает с версией базы данных SQL, и если это не так, я воссоздаю таблицу и заполняю ее новыми данными.

Проблема в том, что ясделал что-то не так с созданием и проверкой номера версии, поэтому я получаю

android.database.sqlite.SQLiteException: Невозможно понизить версию базы данных с версии 5 до 4.

Это исключение довольно простое, но я не знаю, где я испортил.

Это мой SQLiteOpenHelper класс

public class SQLBazaNamirnica extends SQLiteOpenHelper {

    private static final String Ime_Baze = "baza_namirnica";
    private static final String IME_TABELE = "tabela_namirnica";
    private static final String ID_KOLONA = "id";
    private static final String NAMIRNICA_KOLONA = "namirnica";
    private static int VERZIJA_BAZE = 4;

    SQLiteDatabase db;

    Context context;

    public SQLBazaNamirnica(Context context) {
        super(context, Ime_Baze, null, VERZIJA_BAZE);
    }


    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        this.db = sqLiteDatabase;

        String kreirajTabelu = "CREATE TABLE " + IME_TABELE +
                " (" + ID_KOLONA + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                NAMIRNICA_KOLONA + " TEXT )";

        db.execSQL(kreirajTabelu);

    }


    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int staraV, int novaV) {

        if(staraV != novaV)
            sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + IME_TABELE);

    }

    boolean CheckVerziju(int novaVer) {

        //db = getWritableDatabase();

        SQLiteDatabase _db = this.getWritableDatabase();

        Log.d("SQL VERZIJA", "CheckVerziju: VERZIJA BAZE: " + _db.getVersion() + " \n VERZIJA FIREBASE BAZE: " + novaVer);

        if(_db.getVersion() != novaVer) {
            //VERZIJA_BAZE = novaVer;
            _db.setVersion(novaVer);
            return true;
        } else return false;
    }

    void KreirajTabelu() {

        SQLiteDatabase db = this.getWritableDatabase();

        db.execSQL("DROP TABLE IF EXISTS " + IME_TABELE);


        String kreirajTabelu = "CREATE TABLE " + IME_TABELE +
                " (" + ID_KOLONA + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                 NAMIRNICA_KOLONA + " TEXT )";

        db.execSQL(kreirajTabelu);

        Log.d("SQL", "KreirajTabelu: BAZA JE KREIRANA");
    }

    void updateBazu(SQLiteDatabase db, ArrayList<String> namirnice) {

        db = getWritableDatabase();

        ContentValues cv = new ContentValues();

        for(String namirnica : namirnice) {
           /* String query = "INSERT INTO " + IME_TABELE + " (" +
                    NAMIRNICA_KOLONA + ") VALUES (" + namirnica + ")"; */

            cv.put(NAMIRNICA_KOLONA, namirnica);

            db.insert(IME_TABELE, null, cv);
        }
    }
} 

И вот как я проверяю номер версии:

bazaNamirnica = new SQLBazaNamirnica(MainActivity.this);

namirniceDokument.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {

        if(documentSnapshot.exists()) {

            int verzijaBaze = documentSnapshot.getLong("verzija").intValue();

            if(bazaNamirnica.getReadableDatabase().getVersion() != verzijaBaze) {
                //bazaNamirnica.ve

                bazaNamirnica.KreirajTabelu();

                Map<String, Object> namirnice = documentSnapshot.getData();

                ArrayList<String> namirniceFinal = new ArrayList<>();

                for(Map.Entry<String, Object> namirnica : namirnice.entrySet()) {

                    namirniceFinal.add(namirnica.getValue().toString());


                }
                    bazaNamirnica.updateBazu(bazaNamirnica.getWritableDatabase(), namirniceFinal);
                    bazaNamirnica.getWritableDatabase().setVersion(verzijaBaze);

                }

1 Ответ

1 голос
/ 10 ноября 2019

Прежде всего, вы должны всегда проверять, есть ли у вас обновленная версия, которая больше, чем ваша текущая версия базы данных. Функция onUpgrade будет вызываться только при увеличении версии базы данных.

Я не уверен, какие данные вы получаете из базы данных Firebase. Тем не менее, я хотел бы предложить некоторые изменения в вашем коде.

Вместо проверки не равной, вы можете рассмотреть возможность проверки версии базы данных, как показано ниже.

if (bazaNamirnica.getReadableDatabase().getVersion() < verzijaBaze) {
    // Do the upgrade operation. 
}

А также, я не уверен, что вы пытаетесь сделать при обновлении версии. Однако, если вы отбрасываете таблицу, вам может потребоваться создать новую с обновленной структурой, которая вам понадобится при обновлении базы данных.

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int staraV, int novaV) {

    // if(staraV != novaV) // Not necessary, as this will be called on increase in the database version. 

   // So you have dropped the table here
   sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + IME_TABELE);

   // Should create a new one with the updated database schema that you got
   createDatabaseTableWithUpdatedSchema();
}

Надеюсь, это поможет!

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