【问题标题】:Populate Room database using csv file使用 csv 文件填充房间数据库
【发布时间】:2018-07-31 21:23:14
【问题描述】:

我有 9000 个城市需要保存在数据库中,以便用户按城市搜索。

我的房间桌是:

@Entity
public class City extends Model{

    @PrimaryKey
    @NonNull
    private String id = UUID.randomUUID().toString();

    private String name;
    private String state;

    public City(@NonNull String id, String name, String state) {
        this.id = id;
        this.name = name;
        this.state = state;
    }

    @Ignore
    public City() {
    }

    @Ignore
    public City(String name, String state) {
        this.name = name;
        this.state = state;
    }

    @NonNull
    public String getId() {
        return id;
    }

    public void setId(@NonNull String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public String toString() {
        return name + " - " + state;
    }
}

我的 DAO 是

@Dao
public interface CityDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<City> cities);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(City city);

    @Update
    void update(City city);

    @Delete
    void delete(City city);

    @Query("DELETE FROM City WHERE id = :id")
    void delete(String id);

    @Query("SELECT * FROM City")
    List<City> getAll();

    @Query("SELECT * FROM City WHERE id = :id LIMIT 1")
    City findById(String id);

    @Query("DELETE FROM City")
    void removeAll();
}

.csv 文件包含类似的行

1;AC;Acrelandia
2;AC;Assis Brasil

其中的行是:ID、状态和名称。

我的 DatabaseModule 是下一个:

@Module
public class DatabaseModule {
    @Singleton
    @Provides
    SontraDB provideDb(Application app) {
        return Room.databaseBuilder(app, MyDB.class, "mydb.db")
                .build();
    }

      @Singleton
        @Provides
        CityDao provideCityDao(MyDB db) {
            return db.cityDao();
        }

我发现我们可以为数据库构建器设置一个“addCallback”选项,以便在数据库初始化时设置数据。但是,我如何访问那里的 dao?

return Room.databaseBuilder(context,
                MyDB.class,
                "mydb.db")
                .addCallback(new Callback() {
                    @Override
                    public void onCreate(@NonNull SupportSQLiteDatabase db) {
                        super.onCreate(db);
                        Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {
                            @Override
                            public void run() {
                                // insert data using DAO
                            }
                        });
                    }
                })
                .build();

任何想法如何做到这一点?

任何帮助将不胜感激!

【问题讨论】:

标签: android android-room


【解决方案1】:

我最近不得不对 JSON 做一些类似的事情,而您已经非常接近解决您的问题了。我将创建一个静态帮助程序类来将 CSV 文件读入 City 对象列表,假设该方法在 CsvUtils 类中具有类似 public List&lt;City&gt; getCityList() 的签名。然后在您的.addCallBack 中,您会执行以下操作:

@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
    super.onCreate(db);
    Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {
        @Override
        public void run() {
            // insert data using DAO
            provideCityDao(db).insertAll(CsvUtils.getCityList());
        }
    });
}

【讨论】:

  • 非常感谢:我有一个问题.. 不允许提供城市道(db),因为 db 的类型是 SupportSQLiteDatabase 并且我的 provideCityDao 方法允许 MyDB 类(扩展 RoomDatabase).. 你知道吗我可不可以做?谢谢!
  • 我关注了类似于this example 的内容。因此,在您的情况下,您将在顶部有 public abstract CityDao getCityDao();,然后有一个 public static MyDB sInstance 成员变量和创建新数据库或返回现有数据库的 getInstance() 方法。然后provideCityDao(db).insertAll(CsvUtils.getCityList()); 行变为getInstance(context).getCityDao().insertAll(CsvUtils.getCityList());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多