Estoy trabajando en la aplicación Firebase y quiero guardar una lista de más de 5000 elementos de lista de precios recuperados en SQLite.

Aquí está mi código de Firebase :

@Override
protected void onStart() {
    super.onStart();

    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            pricesArrayList.clear();

            for (DataSnapshot PricesListDataSnapshot : dataSnapshot.getChildren()) {

                PricesList pricesList = PricesListDataSnapshot.getValue(PricesList.class);
                pricesArrayList.add(pricesList);

                // I don't know what is the insertion code for SQLite

            }

            // here goes the code for retrieved data from SQLite after it was saved from Firebase

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

Y aquí está el código DB.class

private class DBHelper extends SQLiteOpenHelper {
    private static final int VERSION = 1;
    private static final String DB_NAME = "MyDB1.db";
    public static final String id = "_id";
    public static final String ItemCode = "ItemCode";
    public static final String Product = "Product";

    DBHelper(Context context) {
        super(context, DB_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String create_sql = "CREATE TABLE IF NOT EXISTS "
                + DB_NAME + '(' + id
                + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + ItemCode + " TEXT ,"
                + Product + " TEXT ," +')';
        db.execSQL(create_sql);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + DB_NAME );
    }
}

¿Qué código se debe usar para almacenar la lista de elementos en la base de datos SQLite? Le agradeceré a cualquiera cómo tiene la respuesta.

-1
Junior Dev 13 sep. 2018 a las 01:37

3 respuestas

La mejor respuesta

En su DBHelper necesita un método que inserte sus datos en db, así que ... primero: cree el método

public void isInsertData(Price price) {
   try {
      SQLiteDatabase db = this.getWritableDatabase();
      ContentValues insertValues = new ContentValues();
      insertValues.put(ItemCode, price.getItemCode());
      insertValues.put(Product, price.getProduct());
      db.insert(DB_NAME, null, insertValues);
    } catch (Exception e) {
      e.printStackTrace();
    }
}

Veo que el nombre de su tabla se parece al nombre de su base de datos, le recomiendo que lo cambie, pero es si lo desea.

Segundo: necesitamos una instancia de nuestro ayudante y llamamos al nuevo método, la siguiente línea va en su iteración.

DbHelper dbHelper = new DbHelper(this); //or ActivityName.this
for (DataSnapshot PricesListDataSnapshot : dataSnapshot.getChildren()) {
            PricesList pricesList = PricesListDataSnapshot.getValue(PricesList.class);
            pricesArrayList.add(pricesList);
            dbHelper.isInsertData(pricesList);
  }

¡Eso es! Ahora guarda datos en su base de datos.

Le recomiendo que lea este enlace si tiene alguna pregunta después de eso https://developer.android.com/training/data-storage/sqlite

1
Daniel Carreto 13 sep. 2018 a las 00:56

Apenas recomiendo que use un ORM de su preferencia antes de usar SQLite puro, son más fáciles de entender, fáciles de configurar y más escalables que usar SQLite puro. Este es el que más he usado "GreenDao: http://greenrobot.org/greendao/ ", pero si no quieres o te gusta este, puedes usar cualquier otro, hay muchos por ahí. Un ORM asigna sus objetos de datos en tablas de SQLite y proporciona todos los métodos necesarios para administrar su base de datos. Insertar datos usando GreenDao puede ser tan fácil como el siguiente ejemplo:

NewsArticle[] newsArticles = new NewsArticle[600];
NewsArticle testArticle;
    for (int i = 0; i < 600; i++) {
         testArticle = new NewsArticle();
         testArticle.setTitle("title-text" + i);
         testArticle.setBody("body-text" + i);
         testArticle.setShortDescription("short-text" + i);
         testArticle.setDate(now);
         newsArticles[i] = testArticle;
    }
newsArticleDao.insertInTx(newsArticles);
0
Diego Lovera 13 sep. 2018 a las 05:29

Me gustaría agradecer a todos los que me ayudaron y un agradecimiento especial a @Daniel Carreto. Apliqué los pasos y funciona bien, pero agregué un método lógico (if) donde (si Sqlite está vacío) llame a los datos de Firebase y guárdelos en SQLite, luego detenga la llamada de valueEventListener (si no) obtiene la consulta de SQLite.class . funciona bien pero cuando termino la actividad y la abro nuevamente, el proceso comienza nuevamente aquí está el código después de la actualización

@Override
protected void onStart() {
    super.onStart();

    if (FB2sqLite == null) {

        ArrayList<HashMap<String, String>> myList = FB2sqLite.getProducts();
        if (myList.size() != 0) {
            ListAdapter adapter = new SimpleAdapter(FireBase_Prices.this, myList, R.layout.model,
                    new String[]{item_Code, ItemDesc},
                    new int[]{R.id.ItemCodeView, R.id.descTxt});
            listView.setAdapter(adapter);
        }

    } else {

        mRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                pricesArrayList.clear();

                for (DataSnapshot PricesListDataSnapshot : dataSnapshot.getChildren()) {

                    PricesList pricesList = PricesListDataSnapshot.getValue(PricesList.class);
                    pricesArrayList.add(pricesList);
                    FB2sqLite.insert(pricesList);
                    FB2sqLite.close();
                }

                ArrayList<HashMap<String, String>> myList = FB2sqLite.getProducts();
                if (myList.size() != 0) {
                    ListAdapter adapter = new SimpleAdapter(FireBase_Prices.this, myList, R.layout.model,
                            new String[]{item_Code, ItemDesc},
                            new int[]{R.id.ItemCodeView, R.id.descTxt});
                    listView.setAdapter(adapter);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
}

¿Cómo puedo usar removeEventListener y dónde está la posición de este método?

0
Junior Dev 15 sep. 2018 a las 22:39