OrmLite数据库开源组件学习(1)

项目开发中需要用到将本地数据持久化保存在数据库中,android API中的SQLite数据库虽然非常强大,但是本着这次项目中不重复造轮子,更快点的完成开发。大量的使用了开源组件。OrmLite是查找到的关于数据库操作方面最好的组件之一了。项目中参照着官方的example code我暂时只是做了C(create)操作。再剩下的文章里面我会完成CRUD操作,并会上传一个简单的demo。

首先我们需要去OrmLite官网下载需要jar文件,这里我是将3个(core,jdbc,android)全部下载,并导入到项目中。

下载地址:/

官网上提供了很详细的使用文档和示例代码,最大的问题就是完成时E文的...

在项目里面添加完lib后,我们就可以进行代码工作了,主要分为以下几个步骤:

1.配置class类

2.自定义DatabaseHelper类,继承自OrmLiteSqliteOpenHelper类

3.在Activity中进行操作


第一步,配置class类

为什么要配置class呢?其实就是为了将这个class进行持久化保存到数据库中。

配置class类也分为了3个步骤:

1. 添加@DatabaseTable 注解到每一个需要持久化的类的顶部
2. 添加@DatabaseField 注解到需要持久化的字段上面
3. 为每一个class添加一个无参的构造器,并且构造器在包内是可见的

注解并不是仅仅必须要使用OrmLite的注解,还可以使用来自javax.persistence包的更多的标准JPA注解。例如取代@DatabaseTable注解,可以使用@Entity注解...

先对注解做一个简单的介绍吧。

@DatabaseTable 其实是放在类public class的头部,

 例如:

@DatabaseTable(tableName = "recruit_list_items") 
这里的意思就是创建一个名为"recruit_list_items"的表。

接下来对成员变量进行注解,参照我的例子:

    @DatabaseField(id = true)private String id;@DatabaseField(canBeNull = false)private String position;@DatabaseField(canBeNull = false)private String company_name;@DatabaseField(canBeNull = false)private String pay;@DatabaseField(canBeNull = false)private String time;
对于每个class需要添加@DatabaseField注解到class的成员变量上,这个类是需要持久化到数据库的。每个成员变量都将被作为数据库中激素的一个字段进行持久化。

常用的注解

成员名

数据类型

描述

columnName

String

数据库的列名。如果你没有设置这个成员名,会用标准的形式代替它。

dataType

 

字段的数据类型。通常情况下,数据类型是从java类的成员变量获取的,并不需要进行特殊指出。它相当于是SQL的数据类型。

defaultValue

String

当我们在表中创建新的记录时的一个字段的默认值。默认情况下是没有这个值的。

width

Integer

字段的宽度,主要用于字符串字段。默认是0,意味着采用默认的数据类型和具体的数据库的默认情况。对于字符串以为在255个字符即使有些数据库并不支持。

canBeNull

Boolean

字段是否能被分配null值。默认是true。如果你设置成false,那么你每次在数据库中插入数据是都必须为这个字段提供值。

id

Boolean

这个字段是否是id,默认是false。在一个class中只有一个成变量可以有这个值。id字段是一条记录的唯一标识而且是必需的,只有generatedId和 generatedIdSequence其中之一。

generatedId

Boolean

字段是否自动增加。默认为false。类中的一个成员变量设置了这个值,它告诉数据库每添加一条新记录都自动增加id。当一个有generatedid的对象被创建时使用Dao.create()方法,数据库将为记录生成一个id,它会被返回并且被create方法设置进对象。

generatedIdSequence

String

序列编号的名字,这个值在生成的时候会被使用。和generatedId相似,但是你能够指定使用的序列名称。默认是没有的。一个class中只有一个成员变量可以设置这个值。这仅仅在数据库需要序列生成id时才需要它。如果你选择使用generatedId代替它,那么代码将自动增加序列名。


其他注解

foreign

throwIfNull

useGetSet

persisted

unknownEnumName

format

uniqueIndexName

allowGeneratedIdInsert

foreignAutoRefresh

columnDefinition

unique

uniqueIndex

uniqueCombo

indexName

index

uniqueIndexName

version

maxForeignAutoRefreshLevel

foreignColumnName

foreignAutoCreate

下面这些javax.persistence注解和字段都支持:

注解

注解属性

描述

@Entity

name

用于关联的数据库表的名字。如果没有设置那么类名将被作为表名。

@Column

name

用作表字段的名字。如果没有设置那么变量名将作为字段名。

length

数据库表字段的长度。可能只有应用在字符串并且只被某些数据库类型支持。默认是255。

nullable

设置成true,那么这个字段允许插入null值。

unique

 添加一个约束,它在表中必须是唯一的。

@GeneratedValue

 

用于定义一个自动增长的id值,它只能用于添加到@Id注解。

 

@OneToOne 

 

成员变量使用这些注解后会被认为是外键字段。 ORMLite没有实现多个或一个关系,它也不能使用任何注解成员。它只能使用这些注解的两者之一来表明它是一个外键。

@ManyToOne

 

@JoinColumn

name

设置成员变量的列名(字段名)。

nullable

设置成true,那么这个字段允许插入null值。

@Version

 

使用它将会把short, integer, long,  Date这些类型的成员转化成版本成员。

如果@Column注解在成员变量上用了一个未知的类型,那么它将被认为是序列化类型字段并且这个对象需要实现java.io.Serializable。

(以上转载自: Android数据库ORMlite框架翻译系列(第二章:part 1))

最后就是生成一个无参数的构造器即可。


第二步,自定义DatabaseHelper类,继承自OrmLiteSqliteOpenHelper类

public class RecruitItemDatabaseHelper extends OrmLiteSqliteOpenHelper {private static final String DATABASE_NAME = "databaseName.db";private static final int DATABASE_VERSION = 1;// the Dao object we use to access the 'recruit_list_items' tableprivate Dao<RecruitItemEntity, String> recruitItemDao = null;public RecruitItemDatabaseHelper(Context context){super(context, DATABASE_NAME, null, DATABASE_VERSION);}/*** 创建SQLite数据库* @param sqLiteDatabase* @param connectionSource*/@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {try{UtilLog.e("tag", RecruitItemDatabaseHelper.class.getName() + " onCreate");TableUtils.createTable(connectionSource,RecruitItemEntity.class);// here we try inserting data in the on-create as a testDao<RecruitItemEntity, String> dao = getRecruitItemDao();RecruitItemEntity recruitItemEntity = new RecruitItemEntity();recruitItemEntity.setTitle("test sql");recruitItemEntity.setDetail_url("");recruitItemEntity.setId("1190734");recruitItemEntity.setCompany_name("ABC company");recruitItemEntity.setPay("4858576");recruitItemEntity.setPosition("临沂");recruitItemEntity.setTime("139585487");dao.create(recruitItemEntity);// test input <end>}catch (SQLException e){e.printStackTrace();}}/*** 更新SQLite数据库* @param sqLiteDatabase* @param connectionSource* @param i* @param i2*/@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase,ConnectionSource connectionSource,int i,int i2) {try {UtilLog.e("tag",RecruitItemDatabaseHelper.class.getName()+ " onUpgrade");TableUtils.dropTable(connectionSource, RecruitItemEntity.class, true);// after we drop the old databases, we create the new onesonCreate(sqLiteDatabase, connectionSource);}catch (SQLException e){e.printStackTrace();}}/*** Return the Databases Access Object(DAO) for our RecruitItemEntity.* It will create it or just give the cached value* @return* @throws SQLException*/public Dao<RecruitItemEntity, String> getRecruitItemDao() throws SQLException{if (recruitItemDao == null){recruitItemDao = getDao(RecruitItemEntity.class);}return recruitItemDao;}/*** Close the databases connections and clear any cached DAOs.*/@Overridepublic void close(){super.close();recruitItemDao = null;}

第三步,在Activity查看,添加


public class MainActivity extends SherlockActivity{/*** You'll need this in your class to cache the helper in the class.*/private RecruitItemDatabaseHelper databaseHelper = null;	/*** Called when the activity is first created.*/@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// DatabasesUtilLog.e(LOG_TAG, "creating " + getClass() + " at " + System.currentTimeMillis());// print the all of data in Databases for testTextView tv = new TextView(this);doSampleDatabaseStuff("onCreate", tv);setContentView(tv);}@Overrideprotected void onDestroy() {super.onDestroy();	/** You'll need this in your class to release the helper when done.*/if (databaseHelper != null) {OpenHelperManager.releaseHelper();databaseHelper = null;}}/*** You'll need this in your class to get the helper from the manager once per class.*/private RecruitItemDatabaseHelper getHelper() {if (databaseHelper == null) {databaseHelper = OpenHelperManager.getHelper(this, RecruitItemDatabaseHelper.class);}return databaseHelper;}/*** 访问Databases获取所有的dao并打印* @param action*/private void doSampleDatabaseStuff(String action) {try{// get our daoDao<RecruitItemEntity, String> simpleDao =getHelper().getRecruitItemDao();// query for all of the data objects in the datebasesList<RecruitItemEntity> list = simpleDao.queryForAll();// our string builder for building the content-viewStringBuffer sb = new StringBuffer();sb.append("got ").append(list.size()).append(" entries in ").append(action).append("\n");// if we already have items in the databasesint simpleC = 0;for (RecruitItemEntity r : list){sb.append("------------------------------------------------------\n");sb.append("[").append(simpleC).append("] : \n").append(r).append("\n");sb.append("------------------------------------------------------\n");UtilLog.e(LOG_TAG, sb.toString());simpleC++;
		tv.setText(sb.toString());
} }catch (SQLException e){ e.printStackTrace(); tv.setText("Database exception: " + e); return; } }}



可以看到将在DataHelper中创建数据库时,我们加入的Dao的信息已经被打印出来了。 下一步我们在ListAcitvity中使被点击的Item添加到数据库中 ListActivity:
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {/*监听listView中item的点击事件通过标示符i从moreResponse中提取相对应item中的uId变量将uId变量作为参数传递给下一级Activity*/try {int count = moreResponse.getResponse().getItems().size();if (count > 0){/*todo 将点击的查看详情的item加入到Databases*/Dao<RecruitItemEntity, String> recruitItemDao = getHelper().getRecruitItemDao();recruitItemDao.create(moreResponse.getResponse().getItems().get(i));}}catch (SQLException e){e.printStackTrace();}catch (Exception e){e.printStackTrace();}}});

运行结果如下:







OrmLite数据库开源组件学习(1)

项目开发中需要用到将本地数据持久化保存在数据库中,android API中的SQLite数据库虽然非常强大,但是本着这次项目中不重复造轮子,更快点的完成开发。大量的使用了开源组件。OrmLite是查找到的关于数据库操作方面最好的组件之一了。项目中参照着官方的example code我暂时只是做了C(create)操作。再剩下的文章里面我会完成CRUD操作,并会上传一个简单的demo。

首先我们需要去OrmLite官网下载需要jar文件,这里我是将3个(core,jdbc,android)全部下载,并导入到项目中。

下载地址:/

官网上提供了很详细的使用文档和示例代码,最大的问题就是完成时E文的...

在项目里面添加完lib后,我们就可以进行代码工作了,主要分为以下几个步骤:

1.配置class类

2.自定义DatabaseHelper类,继承自OrmLiteSqliteOpenHelper类

3.在Activity中进行操作


第一步,配置class类

为什么要配置class呢?其实就是为了将这个class进行持久化保存到数据库中。

配置class类也分为了3个步骤:

1. 添加@DatabaseTable 注解到每一个需要持久化的类的顶部
2. 添加@DatabaseField 注解到需要持久化的字段上面
3. 为每一个class添加一个无参的构造器,并且构造器在包内是可见的

注解并不是仅仅必须要使用OrmLite的注解,还可以使用来自javax.persistence包的更多的标准JPA注解。例如取代@DatabaseTable注解,可以使用@Entity注解...

先对注解做一个简单的介绍吧。

@DatabaseTable 其实是放在类public class的头部,

 例如:

@DatabaseTable(tableName = "recruit_list_items") 
这里的意思就是创建一个名为"recruit_list_items"的表。

接下来对成员变量进行注解,参照我的例子:

    @DatabaseField(id = true)private String id;@DatabaseField(canBeNull = false)private String position;@DatabaseField(canBeNull = false)private String company_name;@DatabaseField(canBeNull = false)private String pay;@DatabaseField(canBeNull = false)private String time;
对于每个class需要添加@DatabaseField注解到class的成员变量上,这个类是需要持久化到数据库的。每个成员变量都将被作为数据库中激素的一个字段进行持久化。

常用的注解

成员名

数据类型

描述

columnName

String

数据库的列名。如果你没有设置这个成员名,会用标准的形式代替它。

dataType

 

字段的数据类型。通常情况下,数据类型是从java类的成员变量获取的,并不需要进行特殊指出。它相当于是SQL的数据类型。

defaultValue

String

当我们在表中创建新的记录时的一个字段的默认值。默认情况下是没有这个值的。

width

Integer

字段的宽度,主要用于字符串字段。默认是0,意味着采用默认的数据类型和具体的数据库的默认情况。对于字符串以为在255个字符即使有些数据库并不支持。

canBeNull

Boolean

字段是否能被分配null值。默认是true。如果你设置成false,那么你每次在数据库中插入数据是都必须为这个字段提供值。

id

Boolean

这个字段是否是id,默认是false。在一个class中只有一个成变量可以有这个值。id字段是一条记录的唯一标识而且是必需的,只有generatedId和 generatedIdSequence其中之一。

generatedId

Boolean

字段是否自动增加。默认为false。类中的一个成员变量设置了这个值,它告诉数据库每添加一条新记录都自动增加id。当一个有generatedid的对象被创建时使用Dao.create()方法,数据库将为记录生成一个id,它会被返回并且被create方法设置进对象。

generatedIdSequence

String

序列编号的名字,这个值在生成的时候会被使用。和generatedId相似,但是你能够指定使用的序列名称。默认是没有的。一个class中只有一个成员变量可以设置这个值。这仅仅在数据库需要序列生成id时才需要它。如果你选择使用generatedId代替它,那么代码将自动增加序列名。


其他注解

foreign

throwIfNull

useGetSet

persisted

unknownEnumName

format

uniqueIndexName

allowGeneratedIdInsert

foreignAutoRefresh

columnDefinition

unique

uniqueIndex

uniqueCombo

indexName

index

uniqueIndexName

version

maxForeignAutoRefreshLevel

foreignColumnName

foreignAutoCreate

下面这些javax.persistence注解和字段都支持:

注解

注解属性

描述

@Entity

name

用于关联的数据库表的名字。如果没有设置那么类名将被作为表名。

@Column

name

用作表字段的名字。如果没有设置那么变量名将作为字段名。

length

数据库表字段的长度。可能只有应用在字符串并且只被某些数据库类型支持。默认是255。

nullable

设置成true,那么这个字段允许插入null值。

unique

 添加一个约束,它在表中必须是唯一的。

@GeneratedValue

 

用于定义一个自动增长的id值,它只能用于添加到@Id注解。

 

@OneToOne 

 

成员变量使用这些注解后会被认为是外键字段。 ORMLite没有实现多个或一个关系,它也不能使用任何注解成员。它只能使用这些注解的两者之一来表明它是一个外键。

@ManyToOne

 

@JoinColumn

name

设置成员变量的列名(字段名)。

nullable

设置成true,那么这个字段允许插入null值。

@Version

 

使用它将会把short, integer, long,  Date这些类型的成员转化成版本成员。

如果@Column注解在成员变量上用了一个未知的类型,那么它将被认为是序列化类型字段并且这个对象需要实现java.io.Serializable。

(以上转载自: Android数据库ORMlite框架翻译系列(第二章:part 1))

最后就是生成一个无参数的构造器即可。


第二步,自定义DatabaseHelper类,继承自OrmLiteSqliteOpenHelper类

public class RecruitItemDatabaseHelper extends OrmLiteSqliteOpenHelper {private static final String DATABASE_NAME = "databaseName.db";private static final int DATABASE_VERSION = 1;// the Dao object we use to access the 'recruit_list_items' tableprivate Dao<RecruitItemEntity, String> recruitItemDao = null;public RecruitItemDatabaseHelper(Context context){super(context, DATABASE_NAME, null, DATABASE_VERSION);}/*** 创建SQLite数据库* @param sqLiteDatabase* @param connectionSource*/@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {try{UtilLog.e("tag", RecruitItemDatabaseHelper.class.getName() + " onCreate");TableUtils.createTable(connectionSource,RecruitItemEntity.class);// here we try inserting data in the on-create as a testDao<RecruitItemEntity, String> dao = getRecruitItemDao();RecruitItemEntity recruitItemEntity = new RecruitItemEntity();recruitItemEntity.setTitle("test sql");recruitItemEntity.setDetail_url("");recruitItemEntity.setId("1190734");recruitItemEntity.setCompany_name("ABC company");recruitItemEntity.setPay("4858576");recruitItemEntity.setPosition("临沂");recruitItemEntity.setTime("139585487");dao.create(recruitItemEntity);// test input <end>}catch (SQLException e){e.printStackTrace();}}/*** 更新SQLite数据库* @param sqLiteDatabase* @param connectionSource* @param i* @param i2*/@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase,ConnectionSource connectionSource,int i,int i2) {try {UtilLog.e("tag",RecruitItemDatabaseHelper.class.getName()+ " onUpgrade");TableUtils.dropTable(connectionSource, RecruitItemEntity.class, true);// after we drop the old databases, we create the new onesonCreate(sqLiteDatabase, connectionSource);}catch (SQLException e){e.printStackTrace();}}/*** Return the Databases Access Object(DAO) for our RecruitItemEntity.* It will create it or just give the cached value* @return* @throws SQLException*/public Dao<RecruitItemEntity, String> getRecruitItemDao() throws SQLException{if (recruitItemDao == null){recruitItemDao = getDao(RecruitItemEntity.class);}return recruitItemDao;}/*** Close the databases connections and clear any cached DAOs.*/@Overridepublic void close(){super.close();recruitItemDao = null;}

第三步,在Activity查看,添加


public class MainActivity extends SherlockActivity{/*** You'll need this in your class to cache the helper in the class.*/private RecruitItemDatabaseHelper databaseHelper = null;	/*** Called when the activity is first created.*/@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// DatabasesUtilLog.e(LOG_TAG, "creating " + getClass() + " at " + System.currentTimeMillis());// print the all of data in Databases for testTextView tv = new TextView(this);doSampleDatabaseStuff("onCreate", tv);setContentView(tv);}@Overrideprotected void onDestroy() {super.onDestroy();	/** You'll need this in your class to release the helper when done.*/if (databaseHelper != null) {OpenHelperManager.releaseHelper();databaseHelper = null;}}/*** You'll need this in your class to get the helper from the manager once per class.*/private RecruitItemDatabaseHelper getHelper() {if (databaseHelper == null) {databaseHelper = OpenHelperManager.getHelper(this, RecruitItemDatabaseHelper.class);}return databaseHelper;}/*** 访问Databases获取所有的dao并打印* @param action*/private void doSampleDatabaseStuff(String action) {try{// get our daoDao<RecruitItemEntity, String> simpleDao =getHelper().getRecruitItemDao();// query for all of the data objects in the datebasesList<RecruitItemEntity> list = simpleDao.queryForAll();// our string builder for building the content-viewStringBuffer sb = new StringBuffer();sb.append("got ").append(list.size()).append(" entries in ").append(action).append("\n");// if we already have items in the databasesint simpleC = 0;for (RecruitItemEntity r : list){sb.append("------------------------------------------------------\n");sb.append("[").append(simpleC).append("] : \n").append(r).append("\n");sb.append("------------------------------------------------------\n");UtilLog.e(LOG_TAG, sb.toString());simpleC++;
		tv.setText(sb.toString());
} }catch (SQLException e){ e.printStackTrace(); tv.setText("Database exception: " + e); return; } }}



可以看到将在DataHelper中创建数据库时,我们加入的Dao的信息已经被打印出来了。 下一步我们在ListAcitvity中使被点击的Item添加到数据库中 ListActivity:
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {/*监听listView中item的点击事件通过标示符i从moreResponse中提取相对应item中的uId变量将uId变量作为参数传递给下一级Activity*/try {int count = moreResponse.getResponse().getItems().size();if (count > 0){/*todo 将点击的查看详情的item加入到Databases*/Dao<RecruitItemEntity, String> recruitItemDao = getHelper().getRecruitItemDao();recruitItemDao.create(moreResponse.getResponse().getItems().get(i));}}catch (SQLException e){e.printStackTrace();}catch (Exception e){e.printStackTrace();}}});

运行结果如下: