我的Android之旅(二十四)-------数据库ORMLite框架总结
2016-08-23 20:29
585 查看
ORMlite通过Java注解的方式来建立起与数据库的映射关系,在Android面向数据库开发中,是一个比较流行的开源框架,方便操作而且功能强大
ORMLite的优缺点
优点:轻量级、使用简单、封装完善、文档全面
缺点:基于反射,效率较低,缺少中文翻译文档
添加到项目:
添加库文件到项目libs下,添加为库
ormlite-android-5.0.jar、ormlite-android-5.0-sources.jar
ormlite-core-5.0、ormlite-core-5.0-sources.jar
继承OrmLiteSqliteOpenHelper类定义数据库帮助类
可以在程序被安装时创建或者升级数据库
onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource)
onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion)
下面就是帮助类,可直接粘贴复制:
注意,这里的实体类可依据需要进行更改。
定义实体类Bean,代表一张表
@DatabaseTable:表示定义了一个数据表,如果不指定名字,在Android中会以类名作为表名,
如packageInfo就是SQLite数据库中的表名,我们也可以指定表名,@DatabaseTable(tableName =
"tb_package")
@DatabaseField 常用注解:
columnName 指定字段名,不指定则变量名作为字段名
数据库的增删查改
* 插入操作
* create:插入一条数据
* createIfNotExists:如果不存在则插入
* createOrUpdate:如果存在则更新
* 查询操作
* 首先调用xxxDao.queryBuilder();获得该Dao下的QueryBuilder对象
* 接下来设置QueryBuilder的查询条件
* 最后通过QueryBuilder的query方法获得List对象
* 删除和更改操作
* 与查询操作类似,ORMLite同样为我们提供了一系列的方法,同时也提供了复杂删除,复杂更
* 改的DeleteBuilder和UpdateBuilder,其用法与QueryBuilder相似
* 主要方法
* create 插入一条数据
* createIfNotExists 如果不存在则插入
* createOrUpdate 如果指定id则更新
* queryForId 更具id查找
* update 查找出数据
* delete 删除数据
* queryBuilder() 创建一个查询生成器:进行复杂查询
* deleteBuilder() 创建一个删除生成器,进程复杂条件删除
* updateBuilder() 创建修条件生成器,进行复杂条件修改
下面就是一个简单的实体类的定义, 创建数据库表项
对于类中的每个需要存储的成员变量,都需要添加@DatabaseField注解
tableName表示创建该表的表名,不带该配置表示使用类名作为表名
定义数据访问对象,对指定的表进行增删改查操作。
在这里定义增删改查的方法,需要时直接调用即可:
package com.jerehedu.jereduch10.ormlistdemo;
import android.content.Context;
import com.j256.ormlite.dao.Dao;
import java.sql.SQLException;
import java.util.List;
/**
* Created by 王明松 on 0232016/8/23.
*/
public class UserDaoOrm {
private Context context;
private Dao<User1,Integer> userDao;
private DatabaseHelper helper;
public UserDaoOrm(Context context){
this.context=context;
helper=DatabaseHelper.getHelper(context);
try {
userDao= helper.getDao(User1.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
//添加、修改数据
public void add(User1 user1){
try {
userDao.createOrUpdate(user1);
} catch (SQLException e) {
e.printStackTrace();
}
}
//查询所有
public List<User1> select(){
try {
return userDao.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//删除某一条
public void delete(User1 user1){
try {
userDao.delete(user1);
} catch (SQLException e) {
e.printStackTrace();
}
}
//查询一条数据
public User1 seleteUser(String id){
try {
return userDao.queryBuilder()
.where()
.eq("userId", id)
.queryForFirst();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
在ORMList框架中与sqlite最大的不同,是他将创建与更新的方法写在了一起,根据主键的有无来判断执行哪个方法。
接下来就是建立一个新的Activity来检测一下我们的程序了。
xml文件:
布局文件中只需要添加几个按钮来进行监听即可。
运行结果如下:
输入基本的数据,点击添加按钮,则可添加多条数据
点击查询所有按钮:
输入想要查询的数据,点击查询一条数据按钮。
输入想要删除的数据,点击删除按钮,随后点击查询所有的按钮,可检查是否删除成功。
ORMlite通过Java注解的方式来建立起与数据库的映射关系,在Android面向数据库开发中,是一个比较流行的开源框架,方便操作而且功能强大
ORMLite的优缺点
优点:轻量级、使用简单、封装完善、文档全面
缺点:基于反射,效率较低,缺少中文翻译文档
添加到项目:
添加库文件到项目libs下,添加为库
ormlite-android-5.0.jar、ormlite-android-5.0-sources.jar
ormlite-core-5.0、ormlite-core-5.0-sources.jar
继承OrmLiteSqliteOpenHelper类定义数据库帮助类
可以在程序被安装时创建或者升级数据库
onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource)
onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion)
下面就是帮助类,可直接粘贴复制:
package com.jerehedu.jereduch10.ormlistdemo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static final String TABLE_NAME = "ormtest.db"; private Map<String, Dao> daos = new HashMap<String, Dao>(); private static DatabaseHelper instance; private DatabaseHelper(Context context) { super(context, TABLE_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { try { TableUtils.createTable(connectionSource, User1.class); // TableUtils.createTable(connectionSource, News.class); //如果有多个表,都在这里创建 } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) { try { TableUtils.dropTable(connectionSource, User1.class, true); onCreate(database, connectionSource); } catch (SQLException e) { e.printStackTrace(); } } /** * 单例获取该Helper * * @param context * @return */ public static synchronized DatabaseHelper getHelper(Context context) { context = context.getApplicationContext(); if (instance == null) { synchronized (DatabaseHelper.class) { if (instance == null) { instance = new DatabaseHelper(context); } } } return instance; } public synchronized Dao getDao(Class clazz) throws SQLException { Dao dao = null; String className = clazz.getSimpleName(); if (daos.containsKey(className)) { dao = daos.get(className); } if (dao == null) { dao = super.getDao(clazz); daos.put(className, dao); } return dao; } /** * 释放资源 */ @Override public void close() { super.close(); for (String key : daos.keySet()) { Dao dao = daos.get(key); dao = null; } } }
注意,这里的实体类可依据需要进行更改。
定义实体类Bean,代表一张表
@DatabaseTable:表示定义了一个数据表,如果不指定名字,在Android中会以类名作为表名,
如packageInfo就是SQLite数据库中的表名,我们也可以指定表名,@DatabaseTable(tableName =
"tb_package")
@DatabaseField 常用注解:
columnName 指定字段名,不指定则变量名作为字段名
数据库的增删查改
* 插入操作
* create:插入一条数据
* createIfNotExists:如果不存在则插入
* createOrUpdate:如果存在则更新
* 查询操作
* 首先调用xxxDao.queryBuilder();获得该Dao下的QueryBuilder对象
* 接下来设置QueryBuilder的查询条件
* 最后通过QueryBuilder的query方法获得List对象
* 删除和更改操作
* 与查询操作类似,ORMLite同样为我们提供了一系列的方法,同时也提供了复杂删除,复杂更
* 改的DeleteBuilder和UpdateBuilder,其用法与QueryBuilder相似
* 主要方法
* create 插入一条数据
* createIfNotExists 如果不存在则插入
* createOrUpdate 如果指定id则更新
* queryForId 更具id查找
* update 查找出数据
* delete 删除数据
* queryBuilder() 创建一个查询生成器:进行复杂查询
* deleteBuilder() 创建一个删除生成器,进程复杂条件删除
* updateBuilder() 创建修条件生成器,进行复杂条件修改
下面就是一个简单的实体类的定义, 创建数据库表项
对于类中的每个需要存储的成员变量,都需要添加@DatabaseField注解
tableName表示创建该表的表名,不带该配置表示使用类名作为表名
package com.jerehedu.jereduch10.ormlistdemo; import android.os.Parcel; import android.os.Parcelable; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; /** * Created by 王明松 on 0232016/8/23. */ @DatabaseTable(tableName = "user") public class User1 implements Parcelable{ @DatabaseField(id=true) //id为主键,则为true private String userId; @DatabaseField private String name; @DatabaseField private int age; public User1() { } public User1(String userId, String name, int age) { this.userId = userId; this.name = name; this.age = age; } protected User1(Parcel in) { userId = in.readString(); name = in.readString(); age = in.readInt(); } public static final Creator<User1> CREATOR = new Creator<User1>() { @Override public User1 createFromParcel(Parcel in) { return new User1(in); } @Override public User1[] newArray(int size) { return new User1[size]; } }; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(userId); dest.writeString(name); dest.writeInt(age); } @Override public String toString() { return "User1{" + "userId='" + userId + '\'' + ", name='" + name + '\'' + ", age=" + age + '}'; } }
定义数据访问对象,对指定的表进行增删改查操作。
在这里定义增删改查的方法,需要时直接调用即可:
package com.jerehedu.jereduch10.ormlistdemo;
import android.content.Context;
import com.j256.ormlite.dao.Dao;
import java.sql.SQLException;
import java.util.List;
/**
* Created by 王明松 on 0232016/8/23.
*/
public class UserDaoOrm {
private Context context;
private Dao<User1,Integer> userDao;
private DatabaseHelper helper;
public UserDaoOrm(Context context){
this.context=context;
helper=DatabaseHelper.getHelper(context);
try {
userDao= helper.getDao(User1.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
//添加、修改数据
public void add(User1 user1){
try {
userDao.createOrUpdate(user1);
} catch (SQLException e) {
e.printStackTrace();
}
}
//查询所有
public List<User1> select(){
try {
return userDao.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//删除某一条
public void delete(User1 user1){
try {
userDao.delete(user1);
} catch (SQLException e) {
e.printStackTrace();
}
}
//查询一条数据
public User1 seleteUser(String id){
try {
return userDao.queryBuilder()
.where()
.eq("userId", id)
.queryForFirst();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
在ORMList框架中与sqlite最大的不同,是他将创建与更新的方法写在了一起,根据主键的有无来判断执行哪个方法。
接下来就是建立一个新的Activity来检测一下我们的程序了。
xml文件:
package com.jerehedu.jereduch10.ormlistdemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.jerehedu.jereduch10.R; import java.util.ArrayList; import java.util.List; public class OrmLiteActivity extends AppCompatActivity { private Button add,search,delete,searchOne; private EditText name,id,age; private TextView show; private UserDaoOrm userDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_orm_lite); name= (EditText) findViewById(R.id.name); id= (EditText) findViewById(R.id.id); age= (EditText) findViewById(R.id.age); show= (TextView) findViewById(R.id.show); add= (Button) findViewById(R.id.add); search= (Button) findViewById(R.id.search); delete= (Button) findViewById(R.id.delete); searchOne= (Button) findViewById(R.id.searchOne); userDao=new UserDaoOrm(this); add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { User1 user1=new User1(); user1.setUserId(id.getText().toString()); user1.setName(name.getText().toString()); user1.setAge(Integer.parseInt(age.getText().toString())); userDao.add(user1); Toast.makeText(OrmLiteActivity.this, "新增成功", Toast.LENGTH_SHORT).show(); } }); search.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { List<User1> list= userDao.select(); show.setText(list.toString()); } }); searchOne.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { User1 user1 = null; List<User1> list=userDao.select(); List myData=new ArrayList(); for (User1 u:list){ myData.add(u.getUserId()+":"+u.getName()); } // id.setText(user1.getUserId()); // name.setText(user1.getName()); // age.setText(user1.getAge()+""); show.setText(myData.toString()); } }); delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { User1 user1; if (!id.getText().toString().equals("")){ user1=userDao.seleteUser(id.getText().toString()); userDao.delete(user1); Toast.makeText(getBaseContext(),"删除成功",Toast.LENGTH_SHORT).show(); } } }); } }
布局文件中只需要添加几个按钮来进行监听即可。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context=".ormlistdemo.OrmLiteActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/linearLayout"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入用户名" android:id="@+id/name"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入id" android:id="@+id/id"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入年龄" android:id="@+id/age"/> </LinearLayout> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加" android:id="@+id/add" android:layout_alignTop="@+id/search" android:layout_toEndOf="@+id/search" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/search" android:text="查询所有" android:layout_below="@+id/linearLayout" android:layout_alignParentStart="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/searchOne" android:text="查询一条" android:layout_above="@+id/show" android:layout_toEndOf="@+id/delete" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/delete" android:text="删除" android:layout_alignTop="@+id/searchOne" android:layout_alignParentStart="true" /> <TextView android:layout_width="match_parent" android:layout_height="300dp" android:id="@+id/show" android:text="显示数据" android:layout_alignParentBottom="true" android:layout_alignParentStart="true" /> </RelativeLayout>
运行结果如下:
输入基本的数据,点击添加按钮,则可添加多条数据
点击查询所有按钮:
输入想要查询的数据,点击查询一条数据按钮。
输入想要删除的数据,点击删除按钮,随后点击查询所有的按钮,可检查是否删除成功。
相关文章推荐
- Android事件来源
- 4000 java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoa
- Android学习笔记--3.Intent的使用
- 简单方法实现Android阅读器分页
- ListView中EditText焦点获取
- 获取 ViewPager 内部子控件的方法
- Android之关于SD卡的读取问题
- Android自定义控件,画一条线
- 杂记3:android AsyncTask基础应用
- 安卓日记——保存你的日夜间模式
- ubuntu下不能识别安卓设备
- Android事件总线分发库的使用
- android monitor
- android群英传学习笔记-自定义ScrollView
- android zipalign
- android调试命令积累--getevent
- android lint
- 学习笔记之——Android状态栏微技巧,带你真正理解沉浸式模式
- 判断android中列表是否在顶部
- Android 通过java代码实现修改指定路径文件的读写权限。