greendao的使用(简洁易懂)

今天在项目里使用到了greendao,记录一下greendao的使用过程。

greendao是对sqlite数据库操作的封装,可以让我们更加方便的使用sqlite,其它类似的框架还有OrmLite、SugarORM、Active Android、Realm。但是greendao的性能要远远的高于其它四个框架,在官网有测试结果,因为它不是使用反射的机制,而是直接生成相关的代码。这就大幅度提升了它的性能。

greendao的使用(简洁易懂)_第1张图片

从这个图片里就很清楚的看出,greendao是将一个Java对象直接映射到了数据库中。

使用步骤:

1、配置android工程的build.gradle,引入greendao的相关配置。

sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/java-gen']
        }
    }

注意android工程依赖的包是de.greenrobot:greendao:2.1.0    
compile 'de.greenrobot:greendao:2.1.0'

2、在android工程里建立一个java-gen文件夹,用来存放greendao生成的一些类

greendao的使用(简洁易懂)_第2张图片

greendao的使用(简洁易懂)_第3张图片

greendao的使用(简洁易懂)_第4张图片

3、建立java工程

如果我们要使用greendao需要另建一个纯java工程,这个Java工程用来生成我们android工程中需要用到的一些类,包括Bean,DAO,DaoMaster,DaoSession.

1.1 建立工程

greendao的使用(简洁易懂)_第5张图片

greendao的使用(简洁易懂)_第6张图片

greendao的使用(简洁易懂)_第7张图片

greendao的使用(简洁易懂)_第8张图片

1.2 配置java工程的build.gradle

java工程的build.gradle里添加dependencies

greendao的使用(简洁易懂)_第9张图片

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'de.greenrobot:greendao-generator:2.1.0'
}

注意java工程依赖的包是:
de.greenrobot:greendao-generator:2.1.0
1.3 配置好之后要重新编译一下工程,让android studio去下载对应版本的库文件

greendao的使用(简洁易懂)_第10张图片

greendao的使用(简洁易懂)_第11张图片

1.4 编写java工程里的MyGreenDaoClass类

这个类很关键,它里面会建立数据库和表以及表的各个字段,代码如下

public class MyGreenDaoClass {

     public static void main(String[] args) throws Exception {
         //1、 参数: 1表示数据库版本号 "lhd.test.hello"表示自动生成代码的路径
         Schema schema = new Schema(1,"lhd.test.hello");
         //2、 创建了schema后,就可以用这个schema对象操作数据库了
        //这里我们写了个方法
         mydatabase(schema);
         //3、 使用 DAOGenerator 类的 generateAll() 方法自动生成代码
         //我们将代码自动生成到我们之前建立的android的java-gen目录下,这个路径不是固定的,可以自由设置
         new DaoGenerator().generateAll(schema,"F:\\androidg4\\MyGreenDao\\app\\src\\java-gen");

     }
    private static void mydatabase(Schema schema){
        //1、 创建一个实体类,一个实体类就是数据库的一张表 这里表名为mydata,数据库的名字会在android工程中指定
        Entity mydata = schema.addEntity("MyData");

        //2、 设置实体类的属性,每个属性就是表中的一个字段
        mydata.addIdProperty();   //首先设置一个Id
        mydata.addStringProperty("name");  //设置一个name字段
        mydata.addStringProperty("age");   //设置一个age字段
        mydata.addStringProperty("cool").notNull();//设置一个cool字段,并且不能为空
    }
}

注意一点就是:千万不要倒错包了
greendao的使用(简洁易懂)_第12张图片

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;
1.5 运行java工程生成代码

运行成功会在java-gen目录下产生DaoMaster,DaoSession,mydata,mydataDao文件

运行没有错误,控制台输出

运行后生成的文件

4、android工程使用greendao生成的文件

4.1建立自己的application

// 我们将DaoSession对象放在myapplication里,避免多次生成 Session 对象,这样全局就使用同一个session链接到数据库啦。
myapplication.java

package com.example.lhd.mygreendao;

import android.app.Application;
import android.database.sqlite.SQLiteDatabase;

import lhd.test.hello.DaoMaster;
import lhd.test.hello.DaoSession;

/** * Created by LHD on 2016/6/14. */
public class myapplication extends Application{

    //建立全局的daoSession
    public static DaoSession daoSession;
    public static SQLiteDatabase db;
    @Override
    public void onCreate() {
        super.onCreate();
        setupDatabase();
    }
    private void setupDatabase() {
        // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
        // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
        // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
        //数据库的名字是my_data
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "my_data", null);
        db = helper.getWritableDatabase();
        // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
        DaoMaster daoMaster = new DaoMaster(db);
        daoSession = daoMaster.newSession();
    }
}

别忘了在manifest文件里声明:

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        <!-- 声明自定义的application -->
        android:name=".myapplication"

        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

布局文件:
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">


    <LinearLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal">

        <EditText  android:id="@+id/edit_input" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:hint="输入要添加的数据" android:inputType="text"></EditText>

        <Button  android:id="@+id/add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onMyClick" android:text="添加数据">
        </Button>

        <Button  android:id="@+id/search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onMyClick" android:text="查询">
        </Button>
    </LinearLayout>

    <ListView  android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content">

    </ListView>
</LinearLayout>

主代码文件:
MainActivity.java

package com.example.lhd.mygreendao;

import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

import java.util.List;

import de.greenrobot.dao.query.Query;
import lhd.test.hello.MyData;
import lhd.test.hello.MyDataDao;


public class MainActivity extends ListActivity {

    private SQLiteDatabase db;
    private EditText edit_input;
    private Cursor cursor;

    private String str_input;

    private MyDataDao dataDao;

    //定义一个全局变量i 用来模拟年龄
    private static int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit_input = (EditText) findViewById(R.id.edit_input);
        //获取全局的daoSession然后通过daoSession获取mydataDao
        dataDao = myapplication.daoSession.getMyDataDao();
        db = myapplication.db;
        //获取name字段的行
        String textColumn = MyDataDao.Properties.Name.columnName;
        //按本地语言进行排序
        String orderBy = textColumn + " COLLATE LOCALIZED ASC";
        //执行查询返回一个cursor
        cursor = db.query(dataDao.getTablename(), dataDao.getAllColumns(), null, null, null, null, orderBy);

        //SimpleCursorAdapter的使用
        String[] from = {textColumn, MyDataDao.Properties.Age.columnName};

        int[] to = {android.R.id.text1, android.R.id.text2};

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from,
                to);
        setListAdapter(adapter);

    }

    public void onMyClick(View v) {
        switch (v.getId()) {
            case R.id.add:
                add_data();
                break;
            case R.id.search:
                search_data();
                break;
        }
    }

    //添加一条数据
    public void add_data() {
        str_input = edit_input.getText().toString();
        edit_input.setText("");

        //1、创建对象
        MyData data = new MyData();
        String name = str_input;
        String age = "20" + i++;
        String cool = "yes";
        //2、设置数据
        data.setName(name);
        data.setAge(age);
        data.setCool(cool);
        //3、插入数据
        dataDao.insert(data);
        cursor.requery();
    }

    //查询
    public void search_data() {
        str_input = edit_input.getText().toString();

        if (edit_input.getText().toString().isEmpty()) {
            Toast.makeText(MainActivity.this, "输入错误", Toast.LENGTH_SHORT).show();
        } else {
            Query query = dataDao.queryBuilder()
                    .where(MyDataDao.Properties.Name.eq(str_input))
                    .orderAsc(MyDataDao.Properties.Age)
                    .build();
            List ls = query.list(); //查询返回的list
            Toast.makeText(MainActivity.this, "有" + ls.size() + "条数据符合", Toast.LENGTH_SHORT).show();
            edit_input.setText("");
        }
    }

    //删除
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        //删除操作,通过id删除
        dataDao.deleteByKey(id);
        cursor.requery();
    }
}

特别注意:

android工程和Java工程依赖的包是不同的:
android:
compile ‘de.greenrobot:greendao:2.1.0’
java:
compile ‘de.greenrobot:greendao-generator:2.1.0’

效果图:
greendao的使用(简洁易懂)_第13张图片

demo下载:
green-dao 使用demo - 下载频道 - CSDN.NET
http://download.csdn.net/detail/baidu_31093133/9549719

你可能感兴趣的:(数据库,android,框架,sqlite,greenDAO)