- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些 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)到您的更新或插入语句,除非它是 != 0
或 null
.
但要小心第二种方法:它未经测试,因此也可能对 greendao 的其他部分产生副作用!
关于android - GreenDao IndsertOrReplaceInTx 只插入列表的最后一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484605/
问题是:GreenDao什么时候从session缓存中更新sql数据库? 假设我正在从数据库中查询现有实体,而不是更改其中一个属性(字段)。无论如何,这些更改都是在不指导 sql 数据库的情况下执行的
我有一个现有的 sqlite db 架构(大约 30 个表),我必须将其导入到我的 Android 项目中。 我想在我的代码中使用 greenDao,但如果我已经创建了 sqlite db,我不知道这
如何为一个实体创建多个表? 最佳答案 在 greenDAO 中是不可能的,目前也没有计划支持此功能。你能解释一下你为什么要这样做以及这应该如何工作吗?也许有更好的方法... 关于greendao -
我在我的 Android 项目中使用 GreenDAO。 我已经实现了一个增量更改表,因此我可以跟踪对实体的各个更新。我想在一个“updateTask”方法中跟踪这些更改,因此无论从何处调用它,都可以
我有以下问题: 是否可以使用GreenDao 进行跨平台应用?例如,在桌面和 Android 上运行的应用程序。 有哪些替代方案? 在GreenDao中MasterDao的包是什么? 谁能举个真实的数
我正在使用 greendao 3.2 并制作实体和数据库。它一切正常。 但是在创建必须自动递增的 Id 属性时我遇到了麻烦。我知道如何在 SQL 中做到这一点,但使用 greendao 它给了我更多的
我只需要使用 GreenDao 返回一列。这是 SQL 查询: SELECT NAME FROM PERSON 如何使用 GreenDao 做到这一点? 最佳答案 如果您想执行原始查询(DaoSess
使用 GreenDao,我以某种方式设法将我的数据库置于一个没有 key 的实体的状态。 我的问题是如何清除/删除该实体?我在 AbstractDao 中没有看到可以让我删除另一个列名的函数。 最佳答
我想使用 GreenDao 构建以下查询。 select * from luckydrawclick e where e.user = ? and (e.id = ? or e.id = ? or e
如何在不使用字符串操作的 toLowercase/toUppercase 的情况下使字符串比较不区分大小写 QueryBuilder qb = mPropertyModelDao.queryBuild
我使用以下代码来定义两个通过一对多关系相关的实体。 private static void addLuckyDrawClick(Schema schema) { Entity luckyDra
我有一个具有 3 个一对多关系的实体 private List Data1; private List Data2; private List Data3; 我想在手动创建的列表中总结这些数据(Tot
我已经阅读了 greendao 文档,但没有找到任何关于在由于某种原因实体更新失败时发出警告的方法的线索...... update(T entity) 既不返回任何东西也不抛出任何错误... 那么有什
在我的应用程序中,我有一个 Entity/table,它有一个 Name 字段(在其他几个字段中)。我想要在该表中找到的所有唯一名称的字符串列表。 现在我唯一能想到的就是将所有结果加载到实体对象列表中
我想知道如何获取我的数据库(当然是 *.sqlite 文件)大小(以字节为单位)? 我目前的做法(行不通)是: 新文件(DataManager.getInstance().db.getPath()).
我一直在寻找解决我的问题的方法,但没有成功。 我有一个应用程序,在该应用程序中,我从不同的服务接收数据库中特定实体的信息,因此我使用 greenDAOs insertOrReplace 方法,因此只要
我正在使用 green dao,我已经到了支持多语言的地步,我想为每种语言使用不同的数据库。 到目前为止,我一直在使用 green dao 创建我的数据库。现在我想在 assets 中有多个数据库,只
我有一个具有 500 个属性的实体,每个属性都有人类可修改的名称,例如“serialNumber”,但它的 column_name 是“E_A_XNF”。 现在我有一个表单,它为我提供了一个以列名作为
我是 greenDao(第 3 版)的新手。我有一个带有状态字段的表。我有一个 ID 列表。我想使用 ID 将所有状态更新为“Activity ”。我未能获得此更新的任何此类方法。谁能帮我解决这个问题
我正在尝试使用 greendao 创建两个相同结构的表。所以基本上,我正在做以下事情来实现。创建 Position.class: public class Position { protect
我是一名优秀的程序员,十分优秀!