如何从服务器获取数据并在Android上填充SQL数据库?

我想从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,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);

                }

nt890121 回答:如何从服务器获取数据并在Android上填充SQL数据库?

首先,您应该始终考虑检查是否具有比当前数据库版本更大的更新版本。仅当数据库版本增加时才调用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();
}

希望有帮助!

本文链接:https://www.f2er.com/3130896.html

大家都在问