使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大。所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLite(官网:http://ormlite.com/),以其小巧方便,在Android数据库维护上深受大家的喜爱。
但是ORMLite的文档有比较少,官方老外写的文档又长又乱,我等考不过托福雅思的我也就简单的看了看。把自己写了一个demo,记录一下使用的过程和步骤。
Jar 包的下载地址在:Orm jar包的下载地址
我们需要下载 core 和 android 两个jar,放在工程中就好
一、设置建立自己的与数据库表对应的pojo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99/** * @author zhoushengtao * @since 2013-7-16 下午7:39:05 */ package com.stchou.helloormlite; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; /** * 数据库对应的pojo类,注意一下三点 * 1、填写表的名称 @DatabaseTable * 2、填写表中持久化项的 @DatabaseField 还可使顺便设置其属性 * 3、保留一个无参的构造函数 */ //表名称 @DatabaseTable(tableName = "user") public class User { // 主键 id 自增长 @DatabaseField(generatedId = true) private int id; // 映射 @DatabaseField(canBeNull = false) private String username; // 不为空 @DatabaseField(canBeNull = false) private String password; @DatabaseField(defaultValue = "") private String nickname ; public User() { // ORMLite 需要一个无参构造 } /** * @return the id */ public int getId() { return this.id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the username */ public String getUsername() { return this.username; } /** * @param username the username to set */ public void setUsername(String username) { this.username = username; } /** * @return the password */ public String getPassword() { return this.password; } /** * @param password the password to set */ public void setPassword(String password) { this.password = password; } @Override public String toString() { String text = ""; text += "nid = " + id; text += "nusername = " + username; text += "npassword = " + password; return text; } }
@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…的书写,和一些语法错误带来的崩溃,建议使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113/** * @author zhoushengtao * @since 2013-7-16 下午7:09:08 */ package com.stchou.helloormlite; import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.RuntimeExceptionDao; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.util.Log; import java.sql.SQLException; public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static final String TAG = "DatabaseHelper"; // 数据库名称 private static final String DATABASE_NAME = "HelloOrmlite.db"; // 数据库version private static final int DATABASE_VERSION = 1; private Dao<User, Integer> userDao = null; private RuntimeExceptionDao<User, Integer> userRuntimeDao = null; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); // 可以用配置文件来生成 数据表,有点繁琐,不喜欢用 // super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config); } /** * @param context * @param databaseName * @param factory * @param databaseVersion */ public DatabaseHelper(Context context, String databaseName, CursorFactory factory, int databaseVersion) { super(context, databaseName, factory, databaseVersion); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) { try { //建立User表 TableUtils.createTable(connectionSource, User.class); //初始化DAO userDao = getUserDao(); userRuntimeDao = getUserDataDao(); } catch (SQLException e) { Log.e(TAG, e.toString()); e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion) { try { TableUtils.dropTable(connectionSource, User.class, true); } catch (SQLException e) { Log.e(TAG, e.toString()); e.printStackTrace(); } } /** * @return * @throws SQLException */ private Dao<User, Integer> getUserDao() throws SQLException { if (userDao == null) userDao = getDao(User.class); return userDao; } public RuntimeExceptionDao<User, Integer> getUserDataDao() { if (userRuntimeDao == null) { userRuntimeDao = getRuntimeExceptionDao(User.class); } return userRuntimeDao; } /** * 释放 DAO */ @Override public void close() { super.close(); userRuntimeDao = null; } }
三、将使用的Activity继承 OrmLiteBaseActivity,针对维护的数据,进行增删查改。
只需要使用DAO调用相应的CURD方法就好了,名称命名很好,灰常简单,不做过多讲解,看一次代码就知道了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146package com.stchou.helloormlite; import com.j256.ormlite.android.apptools.OrmLiteBaseActivity; import com.j256.ormlite.dao.RuntimeExceptionDao; import com.j256.ormlite.stmt.DeleteBuilder; import android.os.Bundle; import android.widget.TextView; import java.sql.SQLException; import java.util.List; public class MainActivity extends OrmLiteBaseActivity<DatabaseHelper> { private TextView mTextView; private RuntimeExceptionDao<User, Integer> mUserDAO; User user; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUserDAO = getHelper().getUserDataDao(); mTextView = (TextView)findViewById(R.id.message); deleteAll(); mTextView.append("n#######Begin to Insert#########n"); insertTest(); display(); mTextView.append("n#######Begin to Update#########n"); user.setUsername("update"); update(user); display(); mTextView.append("n#######Begin to Delete#########n"); delete("name2"); display(); mTextView.append("n#######Begin to Search#########n"); mTextView.append(search("name1").toString()); } /** * 插入值测试 */ private void insertTest() { for (int i = 0; i < 5; i++) { user = new User(); user.setUsername("name" + i); user.setPassword("test_pass " + i); mUserDAO.createIfNotExists(user); } } /** * 更新 * * @param user 待更新的user */ private void update(User user) { mUserDAO.createOrUpdate(user); // mUserDAO.update(user); } /** * 按照指定的id 与 username 删除一项 * * @param id * @param username * @return 删除成功返回true ,失败返回false */ private int delete(String username) { try { // 删除指定的信息,类似delete User where 'id' = id ; DeleteBuilder<User, Integer> deleteBuilder = mUserDAO.deleteBuilder(); deleteBuilder.where().eq("username", username); return deleteBuilder.delete(); } catch (SQLException e) { e.printStackTrace(); } return 0; } /** * 按照id查询user * * @param id * @return */ private User search(String username) { try { // 查询的query 返回值是一个列表 // 类似 select * from User where 'username' = username; List<User> users = mUserDAO.queryBuilder().where().eq("username", username).query(); if (users.size() > 0) return users.get(0); } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 删除全部 */ private void deleteAll() { mUserDAO.delete(queryAll()); } /** * 查询所有的 */ private List<User> queryAll() { List<User> users = mUserDAO.queryForAll(); return users; } /** * 显示所有的 */ private void display() { List<User> users = queryAll(); for (User user : users) { mTextView.append(user.toString()); } } }
当然很多情况下我们无法直接继承:
1OrmLiteBaseActivity
我们就可以这样来获取Helper
1
2
3
4
5
6
7
8private DataHelper databaseHelper = null; public DataHelper getHelper() { if (databaseHelper == null) { databaseHelper = OpenHelperManager .getHelper(this, DatabaseHelper.class); } return databaseHelper; }
带上两个附件:
整个Android demo的打包 :点击打开链接
官方ORMLite说明手册:点击打开链接
最后
以上就是深情大米最近收集整理的关于ORMLite学习入门笔记的全部内容,更多相关ORMLite学习入门笔记内容请搜索靠谱客的其他文章。
发表评论 取消回复