gpt4 book ai didi

android - 使用 csv 文件填充 Room 数据库

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:00:10 29 4
gpt4 key购买 nike

我需要将 9000 个城市保存在数据库中以允许用户按城市搜索。

我的房间 table 是:

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

有什么办法吗?

如有任何帮助,我们将不胜感激!

最佳答案

我最近不得不对 JSON 做一些类似的事情,你已经非常接近解决你的问题了。我会创建一个静态帮助程序类来将 CSV 文件读入 City 对象列表,假设该方法具有类似 public List<City> getCityList() 的签名在CsvUtils类(class)。然后在你的.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());
}
});
}

关于android - 使用 csv 文件填充 Room 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51622277/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com