将List <model class =“”>保存到sqlite

时间:2018-09-12 22:37:44

标签: android firebase arraylist firebase-realtime-database android-sqlite

我正在使用Firebase应用程序,我想将超过5000个检索到的PriceList项目列表保存到SQLite中。

这是我的 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) {

        }
    });
}

这是 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 );
    }
}

应使用什么代码在SQLite数据库中存储项目列表? 我将感谢任何有此答案的人。

3 个答案:

答案 0 :(得分:1)

在您的DBHelper中,您需要一个将数据插入db中的方法。 首先:创建方法

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();
    }
}

我看到您的表名看起来与您的数据库名相似,我建议您更改它,但是如果需要的话。

第二:我们需要一个帮助程序实例并调用new方法,下一行进入您的迭代。

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);
  }

就是这样!现在,您将数据保存在数据库中。

如果之后有任何疑问,建议您阅读此链接 https://developer.android.com/training/data-storage/sqlite

答案 1 :(得分:0)

在使用纯SQLite之前,我几乎不建议您使用自己喜欢的ORM,与使用纯SQLite相比,它们更易于理解,易于配置并且可扩展性更高。这是我最常使用的“ GreenDao:http://greenrobot.org/greendao/”,但是如果您不想要或不喜欢这种方法,则可以使用其他任何方法,那里有很多方法。 ORM将您的数据对象映射到SQLite表中,并提供管理数据库所需的所有方法。 使用GreenDao插入数据可以像以下示例一样简单:

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);

答案 2 :(得分:0)

我要感谢所有帮助过我的人,并特别感谢@Daniel Carreto。 我应用了这些步骤,效果很好,但是我添加了逻辑方法(if),其中(如果Sqlite为空)调用firebase数据并将其保存到SQLite中,然后停止调用valueEventListener (如果不是),则会获取 SQLite.class 的查询。 它运作良好,但是当我完成活动并再次打开它时,过程再次开始 这是更新后的代码

def corners(Xs, Ys):
    # ...
    return a, b, c, d

def make_interval(a, b, c, d):
    return [a, b]

def slice_image(image, a, b, c, d):
    return image[a:d, b:c]

如何使用 removeEventListener ,该方法的位置在哪里?