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; } }}

可以看到将在DataHelper中创建数据库时,我们加入的Dao的信息已经被打印出来了。
下一步我们在ListAcitvity中使被点击的Item添加到数据库中
ListActivity:
        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();                }            }        });

运行结果如下:








0 0
原创粉丝点击