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++;
} }catch (SQLException e){ e.printStackTrace(); tv.setText("Database exception: " + e); return; } }}tv.setText(sb.toString());
可以看到将在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++;
} }catch (SQLException e){ e.printStackTrace(); tv.setText("Database exception: " + e); return; } }}tv.setText(sb.toString());
可以看到将在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();}}});
运行结果如下:
发布评论