我正在使用GreenDaoorm库来创建数据库,它与代码中的第一个创建数据库示例一起使用.
现在问题是我找不到任何文档或任何与数据库从资产文件夹复制到内存中数据库相关的内容.
我一直在尝试创建一个数据库,其中所有表都继承了某个元素,以便有可能拥有元数据.
因为我在模型生成器中添加了所有表声明这一行:
public Entity addSuperEntity(Schema schema) {
Entity superEntity = schema.addEntity("superEntity");
superEntity.addIdProperty().primaryKey();
// SET RELATIONSHIP 1:m TO META DATA
}
public Entity addTable(Schema schema) {
Entity mEntity = schema.addEntity("MyEntity");
mEntity.setSuper("superEntity");
mEntity.addIdProperty().PrimaryKey();
// REST OF FIELDS
}
Run Code Online (Sandbox Code Playgroud)
问题是:
在我将这个生成到我的Android项目之后,我怎样才能确保这在现实生活中仍然存在?我现在需要改变什么吗?
官方文档没有关于继承的任何内容.
在处理Bi Directional 1:m关系时,将新对象插入Green-DAO DB的正确方法是什么?
可以说,我有一个聊天应用程序,它有一个会话实体和一个消息实体.每个对话都有一个消息列表,每条消息都有一个父对话.
我现在做的是:
Conversation conv = new Conversation();
ConversationDao.insert(conv);
List<Message> list = conv.getMessageList();
Message msg = new Message();
MessageDao.insert(msg);
msg.setParent(conv.getId());
list.add(msg);
// SHOULD I UPDATE THE CONVERSATION IN THE DB???
Run Code Online (Sandbox Code Playgroud)
在我看来,我没有正确地做到这一点,我希望得到一些指导广告,以正确的方式来做到这一点.
提前致谢...
编辑:
从我的评论中可以看出,在尝试按照我在这里写的方式实现代码之后,我得到了一个null而不是我试图链接的对话.
我改变了我的代码,现在它看起来像这样:
private static void linkMessageToAuthorAndParent(Message messageObj, Thread parent) {
List<Message> threadsMessages = parent.getMessageList();
messageObj.setThread(parent);
messageDao.insert(messageObj);
threadsMessages.add(messageObj);
Log.d("DtabaseHelper.parseMessage", "message was inserted");
}
Run Code Online (Sandbox Code Playgroud)
但同样,我的问题是我不确定连接现在是双向的.
我现在应该更新threadsDao吗?
GreenDAO是否支持多列的主键?
我在两列上使用Property的方法primaryKey(),但它不起作用.我得到例外:
引起:android.database.sqlite.SQLiteException:表"table"有多个主键
如何在多列上创建主键?我应该编辑生成的DAO类吗?
我即将使用Green DAO ORM工具.我将不得不在我的数据库中插入大约六百行的数据.我想知道有一种方法可以使用某种形式的sqlite数据库管理工具或脚本来预填充数据库.我不想手动添加这些实体等等.在android代码中.这将太繁琐和耗时.
我想为我的greenDAO实体添加一些自定义代码.我看到有类似保护区的东西.但我不喜欢将生成的类检入我的git存储库.我想为此使用继承.
即我有一个实体User.所以我希望greenDAO生成一个名为的类UserBase.我想扩展User并实现这样的方法:
public String getFullName() {
return this.first + " " + this.last;
}
Run Code Online (Sandbox Code Playgroud)
在哪里first和last是托管属性.
但我不知道如何告诉greenDAO使用该类User而不是生成的实体UserBase.有没有办法做到这一点?
我想用greendao从sqlite数据库加载所有实体并对结果进行排序.
我可以使用loadAll加载所有实体,但这并不能保证对结果列表的排序.
我最近开始在我的Android应用程序中使用GreenDao,我正在创建一个类别实体,它应该有多个类别实体作为子项.因此我使用树关系如下:
Entity category = schema.addEntity("Category");
...
Property parentIdProperty = category.addLongProperty("parentId").getProperty();
category.addToOne(category, parentIdProperty).setName("parent");
category.addToMany(category, parentIdProperty).setName("children");
Run Code Online (Sandbox Code Playgroud)
这是根据需要创建正确的代码,我有以下内容:
private List<Category> children;
Run Code Online (Sandbox Code Playgroud)
问题
问题是我需要在此属性之前使用@SerializedName属性,因为我正在将具有不同字段名称的一些json(从另一个服务获得)解析为这些Category实体.
对于其他属性,我使用codeBeforeField()方法正确生成属性:
category.addStringProperty("categoryId").codeBeforeField("@SerializedName( \"Id\" )");
Run Code Online (Sandbox Code Playgroud)
有没有办法在这个'children'属性上设置codeBeforeField以添加@SerializedName属性?或者也许还有其他方法可以在我的'children'属性之前生成这个属性?
我试图寻找方法,所以在关系上设置这个,但似乎这个方法只在PropertyBuilder上可用.有没有办法从ToMany关系中检索PropertyBuilder?
任何帮助,将不胜感激.谢谢.
cannot open file at line 30176 of [00bb9c9ce4]
(14) os_unix.c:30176: (24) open(/data/data/c/databases/pos-db-journal) -
(14) cannot open file at line 30176 of [00bb9c9ce4]
(14) os_unix.c:30176: (24) open(/data/data/c/pos-db-journal) -
(14) statement aborts at 14: [SELECT T."_id",T."PRINTDATA",T."POSITION",T."DOUBLEFORMAT",
T."PRINTERMODE",T."INSERTTIME" FROM "PRINT_DATA_ITEM" T] unable to open database file
E/SQLiteQuery: exception: unable to open database file (code 14); query: SELECT T."_id",T.
"PRINTDATA",T."POSITION",T."DOUBLEFORMAT",T."PRINTERMODE",T."INSERTTIME" FROM "PRINT_DATA_ITEM" T
Run Code Online (Sandbox Code Playgroud)
private PrinterTask(Context context) {
this.mContext = context;
helper = new DaoMaster.DevOpenHelper(context, "pos-db", null);
db = helper.getWritableDatabase();
mDaoMaster = new …Run Code Online (Sandbox Code Playgroud) 假设我们有以下实体:项目:
class Item {
...
@Index(unique=true)
private String guid;
...
@ToMany
@JoinEntity(entity = JoinItemsWithTags.class, sourceProperty = "itemGuid", targetProperty = "tagName")
private List<Tag> tagsWithThisItem;
...
}
Run Code Online (Sandbox Code Playgroud)
标签:
class Tag {
@Id
private Long localId;
@Index(unique = true)
private String name;
...
}
Run Code Online (Sandbox Code Playgroud)
我们需要加入他们.这是我的连接实体类:
@Entity(nameInDb = "item_tag_relations")
class JoinItemsWithTags {
@Id
private Long id;
private String itemGuid;
private String tagName;
...
}
Run Code Online (Sandbox Code Playgroud)
我想使用标记名称作为连接属性而不是Long id,因为在与服务器同步时更容易支持一致性.但是当前Item类中的标签getter总是返回一个空列表.我查看了日志并找到了在getter中内部使用的生成查询:
SELECT * <<-- there were a long sequence of fields
FROM "tags" T JOIN item_tag_relations J1
ON T."_id"=J1."TAG_NAME" …Run Code Online (Sandbox Code Playgroud)