Android数据库框架GreenDAO的使用&Demo

本文详细介绍GreenDao框架的特点、配置及代码示例。GreenDao作为一款高性能的Android ORM框架,提供了简洁易用的API,支持数据库加密,且内存占用低。

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

GreenDao 介绍:

greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。如下图所示:


官网地址:http://greenrobot.org/greendao/

github:https://github.com/greenrobot/greenDAO


GreenDao 优点:

  • 性能高,号称Android最快的关系型数据库

  • 内存占用小
  • 库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制

  • 支持数据库加密  greendao支持SQLCipher进行数据库加密 有关SQLCipher可以参考这篇博客Android数据存储之Sqlite采用SQLCipher数据库加密实战

  • 简洁易用的API

配置GreenDao:

工程Gradle:

 classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'

moudle gradle:

apply plugin: 'org.greenrobot.greendao'

greendao{
        schemaVersion 1 //版本号
        targetGenDir 'src/main/java' //默认文件生成位置
    }

 compile 'org.greenrobot:greendao:3.1.0'



代码示例:

创建一个实体类:

@Entity  
public class User {  
    @Id  
    private Long id;  
    @Property(nameInDb = "USERNAME")  
    private String username;  
    @Property(nameInDb = "NICKNAME")  
    private String nickname;  
}  
然后 make project。自动 生成DaoMaster 、DaoSession、UserDao类。

注解:

1.)实体@Entity注解
  • schema:告知GreenDao当前实体属于哪个schema
  • active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
  • nameInDb:在数据中使用的别名,默认使用的是实体的类名
  • indexes:定义索引,可以跨越多个列
  • createInDb:标记创建数据库表
2.)基础属性注解
  • @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
  • @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
  • @NotNul:设置数据库表当前列不能为空
  • @Transient :添加次标记之后不会生成数据库表的列
3.)索引注解
  • @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
  • @Unique:向数据库列添加了一个唯一的约束
4.)关系注解
  • @ToOne:定义与另一个实体(一个实体对象)的关系
  • @ToMany:定义与多个实体对象的关系

单例引用初始化类:

public class DBHelper {
    private static DaoMaster.DevOpenHelper mHelper;
    private static SQLiteDatabase db;
    private static DaoMaster mDaoMaster;
    private static DaoSession mDaoSession;
    private static DBHelper mInstance;


    public DBHelper() {
    }

    /**
     * 单例引用
     *
     * @return
     */
    public static DBHelper getInstance() {
        if (mInstance == null) {
            synchronized (DBHelper.class) {
                if (mInstance == null) {
                    mInstance = new DBHelper();
                }
            }
        }
        return mInstance;
    }

    /**
     * 初始化greenDao
     * @param  name 数据表的名称
     */
    public  DaoSession initDatabase(Context context,String name) {
        // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
        // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
        // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
        mHelper = new DaoMaster.DevOpenHelper(context, name, null);
        db = mHelper.getWritableDatabase();
        // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
        return mDaoSession;
    }

}

MainActivity.java(包含增,删,查,改)

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mAdd, mDelete, mUpdate, mFind;
    private TextView mContext;
    private UserDao userDao;
    private DBHelper dbHelper = DBHelper.getInstance();
    private String TABLE_NAME = "my.db3";//数据表的名称

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
        //初始化对象
        userDao = dbHelper.initDatabase(this, TABLE_NAME).getUserDao();

    }

    private void initEvent() {
        mAdd.setOnClickListener(this);
        mDelete.setOnClickListener(this);
        mUpdate.setOnClickListener(this);
        mFind.setOnClickListener(this);
    }

    private void initView() {
        mContext = (TextView) findViewById(R.id.textView);
        mAdd = (Button) findViewById(R.id.button);
        mDelete = (Button) findViewById(R.id.button2);
        mUpdate = (Button) findViewById(R.id.button3);
        mFind = (Button) findViewById(R.id.button4);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                addDate();
                break;
            case R.id.button2:
                deleteDate();
                break;
            case R.id.button3:
                updateDate();
                break;
            case R.id.button4:
                findDate();
                break;
        }
    }

    /**
     * 增加数据
     */
    private void addDate() {
        User user = new User(null, "zhangsan"+ new Random().nextInt(100), "张三");
        userDao.insert(user);
        mContext.setText(user.getUsername() + user.getNickname());
    }

    /**
     * 删除数据
     */
    private void deleteDate() {
        deleteUserById(2);

    }

    /**
     * 根据主键删除User
     *
     * @param id User的主键Id
     */
    public void deleteUserById(long id) {
        userDao.deleteByKey(id);
    }

    /**
     * 更改数据
     */
    private void updateDate() {
        User user = new User((long) 5, "lisi", "李四");
        userDao.update(user);

    }

    /**
     * 查找数据
     */
    private void findDate() {
        List<User> users = userDao.loadAll();
        String userName = "";
        for (int i = 0; i < users.size(); i++) {
            userName += users.get(i).getUsername() + "," + users.get(i).getNickname() + "\n";

        }
        mContext.setText("查询全部数据==>" + userName);

    }
}

xml

<?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"
   >


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:id="@+id/textView"
        android:layout_below="@+id/button3"
        android:layout_alignParentStart="true"
        android:layout_marginStart="11dp"
        android:layout_marginTop="36dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="增"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginStart="27dp"
        android:layout_marginTop="12dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删"
        android:id="@+id/button2"
        android:layout_alignBaseline="@+id/button"
        android:layout_alignBottom="@+id/button"
        android:layout_alignStart="@+id/button4"
        android:layout_marginStart="18dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="改"
        android:id="@+id/button3"
        android:layout_marginTop="24dp"
        android:layout_below="@+id/button"
        android:layout_alignStart="@+id/button" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查"
        android:id="@+id/button4"
        android:layout_alignBaseline="@+id/button3"
        android:layout_alignBottom="@+id/button3"
        android:layout_toEndOf="@+id/button"
        android:layout_marginStart="50dp" />

</RelativeLayout>

Demo

Demo

参考:

http://blog.youkuaiyun.com/u012702547/article/details/52226163

http://www.cnblogs.com/whoislcj/p/5651396.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值