关闭

ORMLite学习入门笔记

191人阅读 评论(0) 收藏 举报

使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大。所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLite(官网:http://ormlite.com/),以其小巧方便,在Android数据库维护上深受大家的喜爱。

 

但是ORMLite的文档有比较少,官方老外写的文档又长又乱,我等考不过托福雅思的我也就简单的看了看。把自己写了一个demo,记录一下使用的过程和步骤。

 

Jar 包的下载地址在:Orm jar包的下载地址

我们需要下载 core 和 android 两个jar,放在工程中就好


一、设置建立自己的与数据库表对应的pojo

 

[java] view plain copy
 print?
  1. /** 
  2.  * @author zhoushengtao 
  3.  * @since 2013-7-16 下午7:39:05 
  4.  */  
  5.   
  6. package com.stchou.helloormlite;  
  7.   
  8. import com.j256.ormlite.field.DatabaseField;  
  9. import com.j256.ormlite.table.DatabaseTable;  
  10. /** 
  11.  * 数据库对应的pojo类,注意一下三点 
  12.  * 1、填写表的名称 @DatabaseTable 
  13.  * 2、填写表中持久化项的 @DatabaseField 还可使顺便设置其属性 
  14.  * 3、保留一个无参的构造函数 
  15.  */  
  16. //表名称  
  17. @DatabaseTable(tableName = "user")  
  18. public class User  
  19. {  
  20.     // 主键 id 自增长  
  21.     @DatabaseField(generatedId = true)  
  22.     private int id;  
  23.     // 映射  
  24.     @DatabaseField(canBeNull = false)  
  25.     private String username;  
  26.     // 不为空  
  27.     @DatabaseField(canBeNull = false)  
  28.     private String password;  
  29.       
  30.     @DatabaseField(defaultValue = "")  
  31.     private String nickname ;  
  32.       
  33.     public User()  
  34.     {  
  35.         // ORMLite 需要一个无参构造  
  36.     }  
  37.   
  38.     /** 
  39.      * @return the id 
  40.      */  
  41.     public int getId()  
  42.     {  
  43.         return this.id;  
  44.     }  
  45.   
  46.     /** 
  47.      * @param id the id to set 
  48.      */  
  49.     public void setId(int id)  
  50.     {  
  51.         this.id = id;  
  52.     }  
  53.   
  54.     /** 
  55.      * @return the username 
  56.      */  
  57.     public String getUsername()  
  58.     {  
  59.         return this.username;  
  60.     }  
  61.   
  62.     /** 
  63.      * @param username the username to set 
  64.      */  
  65.     public void setUsername(String username)  
  66.     {  
  67.         this.username = username;  
  68.     }  
  69.   
  70.     /** 
  71.      * @return the password 
  72.      */  
  73.     public String getPassword()  
  74.     {  
  75.         return this.password;  
  76.     }  
  77.   
  78.     /** 
  79.      * @param password the password to set 
  80.      */  
  81.     public void setPassword(String password)  
  82.     {  
  83.         this.password = password;  
  84.     }  
  85.   
  86.     
  87.     @Override  
  88.     public String toString()  
  89.     {  
  90.         String text = "";  
  91.   
  92.         text += "\nid = " + id;  
  93.         text += "\nusername = " + username;  
  94.         text += "\npassword = " + password;  
  95.         return text;  
  96.     }  
  97.   
  98. }  

@DatabaseField 可以注释一下成员

columnName

String

数据库表中对应的列名称,如果没有设置,系统将自动生成

dataType

 

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

defaultValue

String

当心插入一条数据时候的默认值,如果没有将为none

width

Integer

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

canBeNull

Boolean

默认值为true,如果设置为false,insert数据是必须保证该列项必须存在一个值。

id

Boolean

不管这个字段是否是id,默认值都是false。作为数据库中的主键存在一个类中。id、generatedId和generatedIdSequence三者只能同时出现一个

generatedId

Boolean

自增长id,默认值为false。调用Dao.create()时候会增加1。id、generatedId和generatedIdSequence三者只能同时出现一个。

generatedIdSequence

String

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

foreign

Boolean

默认值为false,相当于数据库中的外键,链接其他类存储在数据库中。这个字段必须存在自己的原始类型,另一个类必须存在一个id字段(id、generatedid、generatedIdSequence中的一个)

useGetSet

Boolean

申明这个字段可以使用Java类中的get、set映射到数据库表中的赋值和获取。默认值为false

….

 

 

 

 

 

 

 

二、新建一个OpenHelper继承OrmLiteSqliteOpenHelper这个类。

1、  这类创建和扩展必须实现

onCreate(SQLiteDatabase db,ConnectionSource connectionSource)

onUpgrade(SQLiteDatabase db,ConnectionSource connectionSource, int oldVersion, int newVersion)

两个方法

 

2、  初始化DAO。

Dao<T,V>

包含两个泛型,第一个泛型表DAO操作的类,第二个表示操作类的主键类型


当然,ORMLite很有趣的是它存在一个RuntimeExceptionDao这个东西是针对JDBC和一些其他的SQL的。对于Android平台主要是处理了过多繁琐的try…catch…的书写,和一些语法错误带来的崩溃,建议使用。

 

[java] view plain copy
 print?
  1. /** 
  2.  * @author zhoushengtao 
  3.  * @since 2013-7-16 下午7:09:08 
  4.  */  
  5.   
  6. package com.stchou.helloormlite;  
  7.   
  8. import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;  
  9. import com.j256.ormlite.dao.Dao;  
  10. import com.j256.ormlite.dao.RuntimeExceptionDao;  
  11. import com.j256.ormlite.support.ConnectionSource;  
  12. import com.j256.ormlite.table.TableUtils;  
  13.   
  14. import android.content.Context;  
  15. import android.database.sqlite.SQLiteDatabase;  
  16. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  17. import android.util.Log;  
  18.   
  19. import java.sql.SQLException;  
  20.   
  21. public class DatabaseHelper extends OrmLiteSqliteOpenHelper  
  22. {  
  23.     private static final String TAG = "DatabaseHelper";  
  24.     // 数据库名称  
  25.     private static final String DATABASE_NAME = "HelloOrmlite.db";  
  26.     // 数据库version  
  27.     private static final int DATABASE_VERSION = 1;  
  28.   
  29.     private Dao<User, Integer> userDao = null;  
  30.     private RuntimeExceptionDao<User, Integer> userRuntimeDao = null;  
  31.   
  32.     public DatabaseHelper(Context context)  
  33.     {  
  34.         super(context, DATABASE_NAME, null, DATABASE_VERSION);  
  35.        // 可以用配置文件来生成 数据表,有点繁琐,不喜欢用  
  36.        // super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config);  
  37.     }  
  38.   
  39.     /** 
  40.      * @param context 
  41.      * @param databaseName 
  42.      * @param factory 
  43.      * @param databaseVersion 
  44.      */  
  45.     public DatabaseHelper(Context context, String databaseName, CursorFactory factory, int databaseVersion)  
  46.     {  
  47.         super(context, databaseName, factory, databaseVersion);  
  48.     }  
  49.   
  50.     @Override  
  51.     public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource)  
  52.     {  
  53.         try  
  54.         {  
  55.             //建立User表  
  56.             TableUtils.createTable(connectionSource, User.class);  
  57.             //初始化DAO  
  58.             userDao = getUserDao();  
  59.             userRuntimeDao = getUserDataDao();  
  60.         }  
  61.         catch (SQLException e)  
  62.         {  
  63.             Log.e(TAG, e.toString());  
  64.             e.printStackTrace();  
  65.         }  
  66.   
  67.     }  
  68.   
  69.     @Override  
  70.     public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion)  
  71.     {  
  72.         try  
  73.         {  
  74.             TableUtils.dropTable(connectionSource, User.classtrue);  
  75.         }  
  76.         catch (SQLException e)  
  77.         {  
  78.             Log.e(TAG, e.toString());  
  79.             e.printStackTrace();  
  80.         }  
  81.     }  
  82.   
  83.     /** 
  84.      * @return 
  85.      * @throws SQLException 
  86.      */  
  87.     private Dao<User, Integer> getUserDao() throws SQLException  
  88.     {  
  89.         if (userDao == null)  
  90.             userDao = getDao(User.class);  
  91.         return userDao;  
  92.     }  
  93.   
  94.     public RuntimeExceptionDao<User, Integer> getUserDataDao()  
  95.     {  
  96.         if (userRuntimeDao == null)  
  97.         {  
  98.             userRuntimeDao = getRuntimeExceptionDao(User.class);  
  99.         }  
  100.         return userRuntimeDao;  
  101.     }  
  102.       
  103.     /** 
  104.      * 释放 DAO 
  105.      */  
  106.     @Override  
  107.     public void close() {  
  108.         super.close();  
  109.         userRuntimeDao = null;  
  110.     }  
  111.   
  112. }  

 

三、将使用的Activity继承 OrmLiteBaseActivity,针对维护的数据,进行增删查改。

 只需要使用DAO调用相应的CURD方法就好了,名称命名很好,灰常简单,不做过多讲解,看一次代码就知道了

 

[java] view plain copy
 print?
  1. package com.stchou.helloormlite;  
  2.   
  3. import com.j256.ormlite.android.apptools.OrmLiteBaseActivity;  
  4. import com.j256.ormlite.dao.RuntimeExceptionDao;  
  5. import com.j256.ormlite.stmt.DeleteBuilder;  
  6.   
  7. import android.os.Bundle;  
  8. import android.widget.TextView;  
  9.   
  10. import java.sql.SQLException;  
  11. import java.util.List;  
  12.   
  13. public class MainActivity extends OrmLiteBaseActivity<DatabaseHelper>  
  14. {  
  15.     private TextView mTextView;  
  16.     private RuntimeExceptionDao<User, Integer> mUserDAO;  
  17.   
  18.     User user;  
  19.   
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState)  
  22.     {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.activity_main);  
  25.   
  26.         mUserDAO = getHelper().getUserDataDao();  
  27.   
  28.         mTextView = (TextView)findViewById(R.id.message);  
  29.   
  30.         deleteAll();  
  31.         mTextView.append("\n#######Begin to Insert#########\n");  
  32.         insertTest();  
  33.         display();  
  34.         mTextView.append("\n#######Begin to Update#########\n");  
  35.         user.setUsername("update");  
  36.         update(user);  
  37.         display();  
  38.         mTextView.append("\n#######Begin to Delete#########\n");  
  39.         delete("name2");  
  40.         display();  
  41.         mTextView.append("\n#######Begin to Search#########\n");  
  42.         mTextView.append(search("name1").toString());  
  43.     }  
  44.   
  45.     /** 
  46.      * 插入值测试 
  47.      */  
  48.     private void insertTest()  
  49.     {  
  50.         for (int i = 0; i < 5; i++)  
  51.         {  
  52.             user = new User();  
  53.             user.setUsername("name" + i);  
  54.             user.setPassword("test_pass " + i);  
  55.             mUserDAO.createIfNotExists(user);  
  56.         }  
  57.     }  
  58.   
  59.     /** 
  60.      * 更新 
  61.      *  
  62.      * @param user 待更新的user 
  63.      */  
  64.     private void update(User user)  
  65.     {  
  66.         mUserDAO.createOrUpdate(user);  
  67.         // mUserDAO.update(user);  
  68.     }  
  69.   
  70.     /** 
  71.      * 按照指定的id 与 username 删除一项 
  72.      *  
  73.      * @param id 
  74.      * @param username 
  75.      * @return 删除成功返回true ,失败返回false 
  76.      */  
  77.     private int delete(String username)  
  78.     {  
  79.         try  
  80.         {  
  81.             // 删除指定的信息,类似delete User where 'id' = id ;  
  82.             DeleteBuilder<User, Integer> deleteBuilder = mUserDAO.deleteBuilder();  
  83.             deleteBuilder.where().eq("username", username);  
  84.   
  85.             return deleteBuilder.delete();  
  86.         }  
  87.         catch (SQLException e)  
  88.         {  
  89.             e.printStackTrace();  
  90.         }  
  91.         return 0;  
  92.     }  
  93.   
  94.     /** 
  95.      * 按照id查询user 
  96.      *  
  97.      * @param id 
  98.      * @return 
  99.      */  
  100.     private User search(String username)  
  101.     {  
  102.         try  
  103.         {  
  104.             // 查询的query 返回值是一个列表  
  105.             // 类似 select * from User where 'username' = username;  
  106.             List<User> users = mUserDAO.queryBuilder().where().eq("username", username).query();  
  107.             if (users.size() > 0)  
  108.                 return users.get(0);  
  109.         }  
  110.         catch (SQLException e)  
  111.         {  
  112.             e.printStackTrace();  
  113.         }  
  114.         return null;  
  115.     }  
  116.   
  117.     /** 
  118.      * 删除全部 
  119.      */  
  120.     private void deleteAll()  
  121.     {  
  122.         mUserDAO.delete(queryAll());  
  123.     }  
  124.   
  125.     /** 
  126.      * 查询所有的 
  127.      */  
  128.     private List<User> queryAll()  
  129.     {  
  130.         List<User> users = mUserDAO.queryForAll();  
  131.         return users;  
  132.     }  
  133.   
  134.     /** 
  135.      * 显示所有的 
  136.      */  
  137.     private void display()  
  138.     {  
  139.         List<User> users = queryAll();  
  140.         for (User user : users)  
  141.         {  
  142.             mTextView.append(user.toString());  
  143.         }  
  144.     }  
  145. }  

 当然很多情况下我们无法直接继承:

[java] view plain copy
 print?
  1. OrmLiteBaseActivity  

我们就可以这样来获取Helper

[java] view plain copy
 print?
  1. private DataHelper databaseHelper = null;   
  2. public DataHelper getHelper() {    
  3.         if (databaseHelper == null) {    
  4.             databaseHelper = OpenHelperManager    
  5.                     .getHelper(this, DatabaseHelper.class);    
  6.         }    
  7.         return databaseHelper;    
  8.     }    





 带上两个附件:


整个Android demo的打包 :点击打开链接

 官方ORMLite说明手册:点击打开链接

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1715次
    • 积分:136
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:8篇
    • 译文:0篇
    • 评论:0条
    文章存档