gpt4 book ai didi

android - GreenDao IndsertOrReplaceInTx 只插入列表的最后一项

转载 作者:太空狗 更新时间:2023-10-29 12:40:45 28 4
gpt4 key购买 nike

我有一些 POJOS 并为它们创建了一些表。它们都运行良好,这意味着我可以插入它们并加载它们……除了这个:

我的品牌列表包含 6 个元素,我真的确定它们是不同的(放置断点并看到它们)但是当我要通过 greenDao 将它们插入数据库时​​,只插入最后一个元素。我的表是空的,这条语句应该可以填满它。

代码:

public class SingletonDatabase {

private static SingletonDatabase mInstance;
private DaoMaster.OpenHelper mHelper;
private DaoSession mDaoSessionForUI;
private DaoMaster mDaoMaster;
private static Context mCtx;

private SingletonDatabase(Context context) {
mCtx = context;
setupDb();
}

public static synchronized SingletonDatabase getInstance(Context context) {
if (mInstance == null) {
mInstance = new SingletonDatabase(context);
}
return mInstance;
}

private void setupDb() {
mHelper = new DaoMaster.OpenHelper(
mCtx.getApplicationContext(), "mydb", null) {

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
// Handle upgrade
}
};

SQLiteDatabase db = mHelper.getWritableDatabase();
mDaoMaster = new DaoMaster(db);
mDaoSessionForUI = mDaoMaster.newSession();


}

public DaoSession getDaoSessionForUI() {
return mDaoSessionForUI;

}

public DaoSession getDaoSeesion(){

return mDaoMaster.newSession();
}

}

生成的品牌代码:

 * Entity mapped to table BRAND.
*/
public class Brand {

private long tableId;
private String id;
private String name;
private String publicImage;
private String description;
private String lastDownloadedTime;

public Brand() {
}

public Brand(long tableId) {
this.tableId = tableId;
}

public Brand(long tableId, String id, String name, String publicImage, String description, String lastDownloadedTime) {
this.tableId = tableId;
this.id = id;
this.name = name;
this.publicImage = publicImage;
this.description = description;
this.lastDownloadedTime = lastDownloadedTime;
}

public long getTableId() {
return tableId;
}

public void setTableId(long tableId) {
this.tableId = tableId;
}

public String getId() {
return id;
}

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

public String getName() {
return name;
}

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

public String getPublicImage() {
return publicImage;
}

public void setPublicImage(String publicImage) {
this.publicImage = publicImage;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public String getLastDownloadedTime() {
return lastDownloadedTime;
}

public void setLastDownloadedTime(String lastDownloadedTime) {
this.lastDownloadedTime = lastDownloadedTime;
}

}

创建模式的代码:

public class DaoGen {

public static void main(String[] args) throws Exception {

Schema schema = new Schema(1, "com.mmlooloo");

Entity brandList = addBrand(schema);



File f = new File("src-gen");
f.mkdir();

new DaoGenerator().generateAll(schema,f.getAbsolutePath());
}

private static Entity addBrand(Schema schema) {

Entity brand = schema.addEntity("Brand");
brand.addLongProperty("tableId").notNull().primaryKey().autoincrement();
brand.addStringProperty("id");
brand.addStringProperty("name");
brand.addStringProperty("publicImage");
brand.addStringProperty("description");
brand.addStringProperty("lastDownloadedTime");
return brand;

}

}

最后是我如何插入它们:

public class BrandDownloadService extends IntentService {
public BrandDownloadService() {
super("BrandDownloadService");

}
@Override
protected void onHandleIntent(Intent intent) {
....
BrandDao brandDao = SingletonDatabase.getInstance(this).getDaoSeesion().getBrandDao();
brandDao.insertOrReplaceInTx(brandList,true);

}

我设置了断点并检查了我的 brandlist,它有 6 个元素。

任何帮助、解决方法、调试提示...我真的不知道问题出在哪里。

非常感谢!!

编辑:

我创建了非常非常简单(真的很简单,相信我:-))测试项目,它从文件中读取 json,将其解析为列表并将其插入数据库 this并且存在问题。谁能告诉我我的错误是什么?非常非常感谢 :-)。

最佳答案

可能您的 6 个品牌商品共享相同的 tableId。因此 greendao 认为这是一个项目(由主键标识)并将第一个替换为第二个,将第二个替换为第三个,依此类推...

如果您使用了 notNull().primaryKey().autoincrement()

我曾经遇到过同样的问题,并通过更改 dao 生成器项目中用于代码生成的 dao 模板“修复”了它。

如果您不在 primarykey 属性上使用 notNull(),也许它也可以工作。

更新

我又看了一眼greendao:

在 greendao-generator 中,文件 src-template/dao.ftl 您可以找到以下几行:

protected void bindValues(SQLiteStatement stmt, ${entity.className} entity) {
stmt.clearBindings();
<#list entity.properties as property>
<#if property.notNull || entity.protobuf>
<#if entity.protobuf>
if(entity.has${property.propertyName?cap_first}()) {
</#if> stmt.bind${toBindType[property.propertyType]}(${property_index + 1}, entity.get${property.propertyName?cap_first}()<#if
property.propertyType == "Boolean"> ? 1l: 0l</#if><#if property.propertyType == "Date">.getTime()</#if>);

这意味着,如果您在 autoincrement 属性上使用 notNull(),相应的变量将始终绑定(bind)到插入或更新语句。这导致始终手动设置主键的值并忽略 autoincrement,因为

CREATE TABLE mytable ( id integer primary key autoincrement, details varchar(30));
INSERT INTO mytable (id, details) VALUES (0, 'something');

此数据库行中的结果:0 | “某物”

因此这是 greendao 中的一个错误!要解决此问题,您可以不在主键列上指定 notNull,也可以修改文件 dao.ftl(第 126ff 行):

<#list entity.properties as property>
<#if property.notNull || entity.protobuf>
<#if entity.protobuf>
if(entity.has${property.propertyName?cap_first}()) {
</#if>
<#if property.pkAutoincrement>
if(entity.get${property.propertyName?cap_first}() != 0) {
</#if> stmt.bind${toBindType[property.propertyType]}(${property_index + 1}, entity.get${property.propertyName?cap_first}()<#if
property.propertyType == "Boolean"> ? 1l: 0l</#if><#if property.propertyType == "Date">.getTime()</#if>);
<#if entity.protobuf || property.pkAutoincrement>
}
</#if>
<#else> <#-- nullable, non-protobuff -->
${property.javaType} ${property.propertyName} = entity.get${property.propertyName?cap_first}();
if (${property.propertyName} != null) {
<#if property.pkAutoincrement> if (${property.propertyName} != 0) {
</#if> stmt.bind${toBindType[property.propertyType]}(${property_index + 1}, ${property.propertyName}<#if property.propertyType == "Boolean"> ? 1l: 0l</#if><#if property.propertyType == "Date">.getTime() </#if>);
<#if property.pkAutoincrement> }</#if>
}
</#if>

这将导致 greendao NOT 将您的自动增量主键值绑定(bind)到您的更新或插入语句,除非它是 != 0null .

但要小心第二种方法:它未经测试,因此也可能对 greendao 的其他部分产生副作用!

关于android - GreenDao IndsertOrReplaceInTx 只插入列表的最后一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484605/

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