我的Android之旅(二十四)-------数据库ORMLite框架总结

本文介绍了Android开发中常用的ORM框架ORMLite,它通过Java注解实现数据库映射,操作简便且功能全面。文章讨论了ORMLite的优缺点,包括轻量级、使用简单和文档全面等,并提供了将库文件添加到项目的方法。接着,讲解如何继承OrmLiteSqliteOpenHelper创建数据库帮助类,以及如何定义实体类和数据访问对象。最后,展示了如何进行数据库的增删查改操作,并通过一个简单的Activity实例演示了ORMLite的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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>


运行结果如下:

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



点击查询所有按钮:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值