OrmLite数据库开源组件学习(1)
来源:互联网 发布:淘宝代销物流怎么设置 编辑:程序博客网 时间:2024/06/03 00:19
项目开发中需要用到将本地数据持久化保存在数据库中,android API中的SQLite数据库虽然非常强大,但是本着这次项目中不重复造轮子,更快点的完成开发。大量的使用了开源组件。OrmLite是查找到的关于数据库操作方面最好的组件之一了。项目中参照着官方的example code我暂时只是做了C(create)操作。再剩下的文章里面我会完成CRUD操作,并会上传一个简单的demo。
首先我们需要去OrmLite官网下载需要jar文件,这里我是将3个(core,jdbc,android)全部下载,并导入到项目中。
下载地址:http://ormlite.com/releases/
官网上提供了很详细的使用文档和示例代码,最大的问题就是完成时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' table private Dao<RecruitItemEntity, String> recruitItemDao = null; public RecruitItemDatabaseHelper(Context context){ super(context, DATABASE_NAME, null, DATABASE_VERSION); } /** * 创建SQLite数据库 * @param sqLiteDatabase * @param connectionSource */ @Override public 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 test Dao<RecruitItemEntity, String> dao = getRecruitItemDao(); RecruitItemEntity recruitItemEntity = new RecruitItemEntity(); recruitItemEntity.setTitle("test sql"); recruitItemEntity.setDetail_url("http://www.lywww.com"); 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 */ @Override public 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 ones onCreate(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. */ @Override public 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. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Databases UtilLog.e(LOG_TAG, "creating " + getClass() + " at " + System.currentTimeMillis()); // print the all of data in Databases for test TextView tv = new TextView(this); doSampleDatabaseStuff("onCreate", tv); setContentView(tv); } @Override protected 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 dao Dao<RecruitItemEntity, String> simpleDao = getHelper().getRecruitItemDao(); // query for all of the data objects in the datebases List<RecruitItemEntity> list = simpleDao.queryForAll(); // our string builder for building the content-view StringBuffer sb = new StringBuffer(); sb.append("got ").append(list.size()).append(" entries in ").append(action).append("\n"); // if we already have items in the databases int 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; } }}
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public 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)
- 数据库开源ormlite
- Ormlite开源数据库框架
- Android数据库框架ORMLite的学习笔记
- 开源框架-ormlite-android数据库的使用
- Ormlite数据库
- OrmLite数据库
- Ormlite 学习
- Ormlite 学习
- android 数据库操作使用ormlite框架1
- Android使用ORMLite操作数据库(一)
- 使用ORMLite(框架)创建SQLite数据库
- android Sqlite数据库对象模型ORMLite框架学习
- OrmLite框架 ——OrmLite 入门(android数据库操作框架)
- Android数据库ORMlite框架翻译系列(第二章:part 1)
- Android数据库ORMlite框架翻译系列(第二章:part 1)
- Android数据库ORMlite框架翻译系列(第二章:part 1)
- Android数据库ORMlite框架翻译系列(第二章:part 1)
- vtk基本数据结构与模型构建实例讲解
- ARC基础
- 使用PhysicsEditor为物理引擎创建刚体形状
- 小算法程序收集
- ListView直接子条目的高度有效
- OrmLite数据库开源组件学习(1)
- Linux---rrdtool编译时的报错
- Linux系统调用--getpid/getppid函数详解
- Android Wifi work station Framework and Architecture
- android使用Intent传递数据 2 种方式(Intent和Bundle)
- python中@staticmethod 、@classmethod 与一般方法的区别
- 跟我一起写 Makefile(一)
- android 多屏幕支持
- Android 的定向广播 局部广播