如何处理CSV文件中的数据并将其放入会议室数据库并在recylerview中显示?

时间:2018-07-18 08:16:42

标签: android sqlite csv android-studio android-room

检查仓库https://github.com/vivekpanchal/BabyApp

我正在读取数据并像这样更新适配器

CSV文件位于Raw文件夹中的存储库中

想要帮助处理CSV数据

private void readData() {
    InputStream is = getResources().openRawResource(R.raw.babynames);
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(is, Charset.forName("UTF-8"))
    );
    String line = "";

    try {
        reader.readLine();
        String mGender,mMeaning,mName,mOrigin;
        while ((line = reader.readLine()) != null) {
            Log.d("MyActivity", "Line: " + line);

            String[] tokens = line.split(",");

            mGender=tokens[1];
            mMeaning=tokens[2];
            mName=tokens[3];
            mOrigin=tokens[4];


            BabyName babyName=new BabyName(mGender,mMeaning,mName,mOrigin);
            babyName.setGender(mGender);
            babyName.setName(mName);
            babyName.setOrigin(mOrigin);
            babyName.setMeaning(mMeaning);
            database.babyDao().insert(babyName);
            babyNames.add(babyName);
            Log.d(TAG, "Just created: " + mGender+mMeaning+mName+mOrigin);

        }
    } catch (IOException e) {
        Log.wtf("MyActivity", "Error reading data file on line" + line, e);
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:2)

我通过了GitHub项目链接,您的CSV文件中的条目超过了 22K 。 另一件事是您不从Room中读取数据,您刚刚插入了这些对象并使用ArrayList更新适配器。

首先,您应该在主线程上执行此 CPU密集型操作,这是阻塞用户界面的时间很长。 [我的设备上刚刚测试过的代码]

使用辅助线程或任何其他线程机制(如 RxJava )执行此 CPU密集型操作。然后将结果返回到主线程并更新您的UI。

考虑到22K条目,您应该考虑使用Android体系结构库随附的分页

在另一个线程上执行private void readData()操作,创建对象列表并一次插入数据库。使用下面的另一种dao方法

@Insert
void insertAll(List<BabyName> babyNames);

使用List<BabyName>方法在Activity中观察database.babyDao().getAllData();,在该观察者中,将BabyNames设置为adapter.setBabyNames(names)的适配器并调用adapter.notifyDatasetChanged()

这是观察LiveData的方法-示例ProductFragment

// Observe product data
model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
    @Override
    public void onChanged(@Nullable ProductEntity productEntity) {
        model.setProduct(productEntity);
       // Update adapter data and notify dataset changed here
    }
});

如果您要使用 Room 数据库,并且想遵循 Android体系结构指南,请使用MVVM体系结构。打开应用程序后,您将开始CSV处理任务,UI会使用LiveData观察数据库的更改。因此,在完成csv处理并更新数据库后,您可以在用户界面中查看所有内容

有关分页支持,请参阅此文章-Android Pagination

编辑1

我已经在 GitHub 上创建了Pull Request,可以解决此问题。 现在,应用程序已按预期运行。

它解决了以下问题

  • CSV处理(在后台)
  • BabyDao和必需的 LiveData 方法
  • 具有观察婴儿名单的MainActivity
  • MainActivity如果尚未插入,则在后台处理CSV
  • RecyclerView正常运行- LayoutManager错误已修复