哪个是适用于Android的最佳ORM工具?
我看到ORMlite和ActiveAndroid是最受讨论的,我的一个朋友建议我使用GreenDAO.那么寻找一些可以帮助我做决策的知识资源?
我希望判断的功能是免费提供(开源),良好的文档,活动论坛,稳定版本等,这是开发人员所需要的.
我有一个REST服务,我正在从我的应用程序调用,它将一个JSON对象作为一个JSON对象byte[]
,然后变成一个漂亮的嵌套对象集合 - 所有这一切工作正常.我当时想要做的就是使用OrmLite将这些对象持久化到SQLite存储,这就是事情开始崩溃的地方,因为据我所知,OrmLite不会自动持久化嵌套对象.
为简单起见,让我们删除我的实际功能,并让我的对象简单地建模如下:
@DatabaseTable(tableName = "parents")
public class Parent {
@DatabaseField(id=true)
private String name;
@ForeignCollectionField
// have to use Collection here because needs to be compatible with Jackson
private Collection<Child> children;
/* Getters and setters go here */
}
@DatabaseTable(tableName = "children")
public class Child {
@DatabaseField(id=true)
private String name;
@DatabaseField(foreign=true)
private Parent parent;
/* Getters and setters go here */
}
Run Code Online (Sandbox Code Playgroud)
发生的情况是,在Parent
使用我的相应parentDao
对象添加在数据库中创建新对象时,子项不会与父项一起保留.
这是一个常见的问题并且之前已经提出过,在SO上肯定还有其他问题与这个非常类似,最值得注意的是在Android上用ORMLite保存嵌套的外来对象,以回答Gray建议在父对象之前创建子对象的问题.可以正常手动创建我的POJO.
但是,我还没有看到一个答案,这些因素是由另一个库(在本例中为Jackson)生成对象的情况.没有深入挖掘杰克逊的反序列化内部(它消除了其简单性的全部好处)并试图让杰克逊创建子对象然后将它们添加到父对象(除非我遗漏了一些东西,这比听起来容易吗?)在这种特殊情况下,这似乎不是一个特别有吸引力的解决方案.
同样,还有其他解决方案涉及向外键添加更多注释,这些注释似乎适合处理单个子对象,但在使用@ForeignCollectionField
s及其相应的Collection
s 时,这些注释不可用.
我正在寻找一个关于如何在SQLite和Android中使用ORMLite的好的入门教程.一个qucick谷歌搜索没有产生任何有用的信息.
在Android上工作时,ORMLite是否只保存浅层对象?我有一个嵌套对象的数据结构,这两个对象都是新创建的,我希望能够通过一次调用dao.create()来保存它们.
例如,我有以下父类.
@DatabaseTable
public class Parent {
@DatabaseField(generatedId=true)
public int id;
@DatabaseField
public String name;
@DatabaseField
public Child child;
}
Run Code Online (Sandbox Code Playgroud)
和以下儿童班.
@DatabaseTable
public class Child {
@DatabaseField(generatedId=true)
public int id;
@DatabaseField
public String name;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做到以下几点.
Parent parent = new Parent();
parent.name = "ParentName";
Child child = new Child();
child.name = "ChildName";
parent.child = child;
// .. get helper and create dao object...
dao.create(parent);
Run Code Online (Sandbox Code Playgroud)
执行此操作时,父对象是持久的但不是子对象,并且child_id
父表中的自动生成列设置为0.这是正常行为吗?有没有办法让嵌套对象保持不变并传播主键?
有没有办法投ArrayList
来ObservableList
?我想不经过迭代就这样做ArrayList
.
更具体地说,我使用ORMLite从数据库中获取数据,我需要ObservableList
作为从DB获取数据的方法的输出.
目前我正在做这样的事情:
ArrayList<Stavka> listStavaka = new ArrayList<>();
Dao<Stavka, Integer> stavkaDao = DaoManager.createDao(connection, Stavka.class);
listStavaka = (ArrayList<Stavka>) stavkaDao.queryForAll();
ObservableList<Stavka> oListStavaka = FXCollections.observableArrayList();
for (Stavka stavka : listStavaka) {
oListStavaka.add(stavka);
}
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
ObservableList<Stavka> listStavaka = FXCollections.observableArrayList();
Dao<Stavka, Integer> stavkaDao = DaoManager.createDao(connection, Stavka.class);
listStavaka = (ObservableList<Stavka>) stavkaDao.queryForAll();
Run Code Online (Sandbox Code Playgroud) 有没有办法,如何获取查询的Cursor,我正在使用ORMLite Dao对象处理?
我正在使用Android Studio,并希望使用ORMLite框架.ORMLite for Android有一种通过表配置文件创建DAO的机制.
如何在Android Studio中设置其他运行配置以生成此配置?
我一直在我的应用程序中使用ORMLite,我正在考虑是否转向greenDAO.
性能是该决定的重要组成部分,greenDAO的功能页面说:
对于相同的给定实体,greenDAO插入和更新实体的速度提高了2倍,并且加载实体的速度比ORMLite快4.5倍.
...
(图表和图表更新于10-23-2011)
我认为ORMLite的配置文件生成步骤应该在运行时不需要反射.
ORMLite changlog表明greenDAO基准测试是在配置文件功能发布后完成的,但是greenDAO功能页面没有明确说明是否为测试生成了静态配置文件.
4.26:9/26/2011(svn r1978)
*ANDROID:添加了字段配置实用程序,以避免带注释的Dao创建性能问题.
从那以后,也有ORMLite性能修复,例如
4.40:4/16/2012(svn r2516)
*ANDROID:创建DAO时出现大的性能错误修复.外部字段总是使用反射而不是表格配置.
谁能确认greenDAO和ORMLite之间是否仍有很大的性能差异?谢谢!
如果我对我的解释不是很清楚,我会道歉但是如果要求,我会添加并编辑这个问题.
我正在开发一个Android应用程序,它通过外部API接收数据,并使用ORMLite在本地存储数据.在本地存储数据并使用ORMLite之前,我有一些模型从服务器检索JSON并通过以下方式对其进行解析:
Gson gson = new Gson();
String result = ApiClient.httpPost("/user_route");
User user = gson.fromJson(result, User.class);
Run Code Online (Sandbox Code Playgroud)
User类已定义
public class User {
int id;
String name;
ArrayList<Image> media;
}
Run Code Online (Sandbox Code Playgroud)
而Image类:
public class Image {
int id;
int creator_id;
String url;
}
Run Code Online (Sandbox Code Playgroud)
这是模型和方法的简化表示,但我相信我保留了所有相关信息.BTW,media
是一个包含的JSON对象Images
.
现在我还试图在本地存储数据.为了使用ORMLite在Users和Images之间建立关系,你似乎必须使用ForeignCollection类和@ForeignCollectionField注释.我不相信Gson可以直接media
将User类中的字段作为ForeignCollection对象解析,所以我认为我需要创建两个字段mediaCollection
和media
.
使用ORMLite,User类现在看起来像这样:
@DatabaseTable(tableName = "Users")
public class User {
@DatabaseField(generatedId = true)
int id;
@DatabaseField
String name;
@ForeignCollectionField
ForeignCollection<Image> mediaCollection;
ArrayList<Image> media;
}
Run Code Online (Sandbox Code Playgroud)
带有ORMLite的Image类如下所示:
@DatabaseTable(tableName = "Images")
public class …
Run Code Online (Sandbox Code Playgroud) 我需要删除ORMLite数据库中的记录我可以通过id删除记录,如下所示
@Override
public void Delete(int id) throws SQLException {
this.dao.deleteById(id);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我必须删除同一个表中的记录而不是id,而是通过名称或任何其他字段我想要的东西
public void Deletefromcanteen(String name,MealType mealtype) {
this.dao.deletebyName(name);
}
Run Code Online (Sandbox Code Playgroud)
我应该使用querybuilder写什么查询来删除name = name和mealtype = say(午餐)的记录
我在databasehelper类中尝试过类似的东西
public void deletefromcanteen(int id, String mealtype) {
try {
Dao<CanteenLog, Integer> canteenDao = getCanteen();
DeleteBuilder<CanteenLog, Integer> deleteBuilder = canteenDao
.deleteBuilder();
deleteBuilder.where().eq("user_id", id).and().eq("meal", mealtype);
canteenDao.delete(deleteBuilder.prepare());
} catch (Exception e) {
...
}
}
Run Code Online (Sandbox Code Playgroud)