您的位置:首页 > 移动开发 > Android开发

我的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)



下面就是帮助类,可直接粘贴复制:

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>


运行结果如下:



输入基本的数据,点击添加按钮,则可添加多条数据



点击查询所有按钮:



输入想要查询的数据,点击查询一条数据按钮。



输入想要删除的数据,点击删除按钮,随后点击查询所有的按钮,可检查是否删除成功。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: